使用Mockito对Runnable进行单元测试

时间:2017-06-20 11:03:22

标签: java unit-testing mocking mockito powermockito

我有一个这样的代码,我想编写单元测试。

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()方法。

1 个答案:

答案 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();