我有一个这样的代码,我想编写单元测试。
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()方法。
答案 0 :(得分:4)
将模拟Handler
传递给TestClass
的构造函数。
然后使用Mockito.verify()
断言已调用callHandler()
方法。
您可以存储一个倒计时CountDownLatch
的答案,以使测试等待处理程序被命中。等待将涉及设置合理的超时,这可能是棘手的,您不希望它太高,或者失败将使测试运行更长时间,并且不会太低以致您不会得到误报。
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();