我有这样的代码,我想为其编写单元测试。
public class TestClass {
private final Executor executor;
private final Handler handler;
TestClass(Executor executor, Handler handler) {
this.executor = executor;
this.handler = handler;
}
void doSomething(String param1) {
executor.execute(new Runnable() {
@Override
public void run() {
//do something
handler.callHandler();
}
});
}
}
如何使用 Mockito/Powermockito 来验证是否调用了 callHandler() 方法。
最佳答案
将模拟 Handler
传递给 TestClass
的构造函数。
然后使用 Mockito.verify()
断言调用了 callHandler()
方法。
涉及并发
您可以在 CountDownLatch
上 stub 倒计时的答案,以使测试等待处理程序被命中。等待将涉及设置合理的超时,这可能很棘手,您不希望它太高,否则失败会使测试运行更长的时间,但也不能太低,以免出现误报。
Handler handler = mock(Handler.class);
CountDownLatch finished = new CountDownLatch(1);
doAnswer(invocation -> {
finished.countDown();
return null;
}).when(handler).callHandler();
TestClass testClass = new TestClass(executor, handler);
testClass.doSomething("thisThing");
boolean ended = finished.await(10, TimeUnit.SECONDS);
assertThat(ended).isTrue();
verify(handler).callHandler();
绕过并发
如果您只是想确定是否调用了处理程序,则可以使用在同一线程上执行的 Executor
。这将使测试更加稳定。
Handler handler = mock(Handler.class);
Executor executor = new Executor() {
@Override
public void execute(Runnable command) {
command.run();
}
};
TestClass testClass = new TestClass(executor, handler);
testClass.doSomething("thisThing");
verify(handler).callHandler();
关于java - 使用 Mockito 对 Runnable 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44651272/