如何模拟方法与无效返回类型?
我实现了一个观察者模式,但我不能用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();
}
系统不会被mock触发。
我想展示上述系统的状态。并据此断言。
加上@sateesh所说的,当你只是想模拟一个void方法以防止测试调用它时,你可以这样使用Spy:
World world = new World();
World spy = Mockito.spy(world);
Mockito.doNothing().when(spy).methodToMock();
当您希望运行测试时,请确保在spy对象上调用in test方法,而不是在world对象上调用。例如:
assertEquals(0, spy.methodToTestThatShouldReturnZero());
首先:你应该总是导入mockito static,这样代码将更易于阅读(和直观):
import static org.mockito.Mockito.*;
对于部分嘲笑,仍然保持原始功能上的休息模拟提供“间谍”。
你可以这样使用它:
private World world = spy(new World());
要消除一个正在执行的方法,你可以使用这样的方法:
doNothing().when(someObject).someMethod(anyObject());
给一个方法一些自定义行为,使用"when"和"thenReturn":
doReturn("something").when(this.world).someMethod(anyObject());
对于更多的例子,请在文档中找到优秀的模拟样品。
我想我已经找到了这个问题的一个更简单的答案,为一个方法调用真正的方法(即使它有一个void返回),你可以这样做:
Mockito.doCallRealMethod().when(<objectInstance>).<method>();
<objectInstance>.<method>();
或者,你可以为该类的所有方法调用real方法,这样做:
<Object> <objectInstance> = mock(<Object>.class, Mockito.CALLS_REAL_METHODS);