如何用void返回类型模拟方法?
我实现了一个观察者模式,但我无法用Mockito模拟它,因为我不知道如何.
我试图在互联网上找到一个例子,但没有成功.
我的班级看起来像
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
Run Code Online (Sandbox Code Playgroud)
系统不会通过模拟触发.=(我想显示上面提到的系统状态.并根据它们做出断言.
我想知道如何对抽象类进行单元测试,以及扩展抽象类的类.
我应该通过扩展它来测试抽象类,删除抽象方法,然后测试所有具体方法吗?然后只测试我覆盖的方法,并在单元测试中测试扩展我的抽象类的对象的抽象方法?
我是否应该有一个抽象的测试用例,可以用来测试抽象类的方法,并在我的测试用例中为扩展抽象类的对象扩展这个类?
请注意,我的抽象类有一些具体的方法.
我是JUnit的Java测试新手.我必须使用Java,我想使用单元测试.
我的问题是:我有一个带有一些抽象方法的抽象类.但是有些方法并不是抽象的.如何使用JUnit测试此类?示例代码(非常简单):
abstract class Car {
public Car(int speed, int fuel) {
this.speed = speed;
this.fuel = fuel;
}
private int speed;
private int fuel;
abstract void drive();
public int getSpeed() {
return this.speed;
}
public int getFuel() {
return this.fuel;
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试getSpeed()
和getFuel()
功能.
这个问题的类似问题在这里,但它没有使用JUnit.
在JUnit FAQ部分中,我找到了这个链接,但我不明白作者想用这个例子说些什么.这行代码是什么意思?
public abstract Source getSource() ;
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习测试,但在测试抽象类时我遇到了一些问题.我知道我可以创建一个继承自Dog的具体子类,比如ConcreteDog,但是如果我向Dog添加一个新的抽象方法,我将不得不向ConcreteDog添加一个空方法.我想这不会那么酷.
public abstract class Dog {
private final int id;
public Dog(int id) {
this.id = id;
}
public int getId() {
return id;
}
public abstract void makeSound();
}
...
public class DogTest {
@Test
public void testGetId() {
int id = 42;
// How to pass id to Dog constructor ?
Dog dog = Mockito.mock(Dog.class, Mockito.CALL_REAL_METHODS);
assertTrue(dog.getId() == id);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是以某种方式用构造函数调用Mock,就像
Mockito.mock(Dog(id).class, Mockito.CALL_REAL_METHODS);
Run Code Online (Sandbox Code Playgroud)
我不知道是否可以使用mockito,但有一种方法可以使用mockito或其他工具吗?
我想用Mockito对这个抽象类进行单元测试,详见这篇精彩的答案.
诀窍是,抽象类依赖于在其构造函数中注入的策略.我已经创建了一个模拟策略,我希望我的模拟BaseClass实例能够使用模拟策略进行单元测试.
关于如何连接它的任何建议?我目前没有使用任何IoC框架,但我正在考虑Spring.也许它会成功吗?
// abstract class to be tested w/ mock instance
abstract BaseClass
{
// Strategy gets mocked too
protected BaseClass( Strategy strategy)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
根据Mockito邮件列表,目前没有办法将参数传递给mock的构造函数.
当我尝试模拟javax.ws.rs.core时,Response
我收到一条错误消息:
无法创建JAX-RS运行时委托
为什么会这样?
Response response = Mockito.mock(Response.class);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试模拟HttpServletResponse时,没有问题!
HttpServletResponse response1 = Mockito.mock(HttpServletResponse.class);
Run Code Online (Sandbox Code Playgroud) 我正在编写一个JUnit测试并使用Mockito,我想调用一个方法,该方法又多次调用第二个方法.我不希望在单元测试期间调用第二种方法,但我想知道它的参数是什么.我要测试的代码看起来像这样:
public class MyClass {
public void myMethod() {
int a = [do some logic]
int b = [do some logic];
doSomething(a, b);
a = [do some logic];
b = [do some logic];
doSomething(a, b);
}
public void doSomething(int a, int b) {
// code that I do not want to be executed during a unit test
}
}
Run Code Online (Sandbox Code Playgroud)
现在进行单元测试:
@Test
public void test() {
MyClass myClass = new MyClass();
myClass.myMethod();
verify(myClass).doSomething(17, 33);
verify(myClass).doSomething(9, 18);
}
Run Code Online (Sandbox Code Playgroud)
我是Mockito的新手,我不知道A)是否可以阻止执行doSomething()和B)验证a&b参数的值.我愿意接受像"Mockito在这里不能帮助你"或"这不是技术上可行的东西"这样的答案.如果没有办法模仿这种事情,我可以考虑将那些[做一些逻辑]块重构为我可以直接测试的方法但是我的代码比这个简单的例子更复杂,我不允许在线发布代码.
我有一个没有抽象方法的abstract
类......如何测试这个?我可以简单地将它导入测试类并照常开展业务吗?
例:
public abstract class SomeAbstractClass implements SomeOtherClass {
// Some variables defined here
private static final String dbUrl = System.getProperty("db.url");
// Some public methods
public String doSomethingToUrl(String url) {
url = url + "/takeMeSomewhereNice";
}
}
Run Code Online (Sandbox Code Playgroud)
说我在ARG通为db.url
的localhost:8080
,我想测试的doSomethingToUrl
方法做输出新的字符串...它仍然会是这种格式?
public class TestUrl {
SomeAbstractClass sac = new SomeAbstractClass();
@Test
public void testUrlChange() throws Exception {
String testUrl = "localhost:8080";
assertThat("localhost:8080/takeMeSomewhereNice",
sac.doSomethingToUrl(testUrl));
}
}
Run Code Online (Sandbox Code Playgroud)