我有这样的代码,我想为其编写单元测试。
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
使测试等待处理程序被击中。等待将涉及设置合理的超时,这可能很棘手,您不希望它太高,否则失败将使测试运行更长的时间,并且不能太低,以免出现误报。
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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)