java - 使用 Mockito 对 Runnable 进行单元测试

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

最佳答案

将模拟 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/

相关文章:

java - Camel : Ignore some messages in mock endpoint

java - 为什么hang()方法只执行一次?

c++ - 如何在 C++ 中通过链接器进行模拟测试

java - Visual C# 与 vs2010 错误 : cannot deduce auto type initializer required error in my code which is working on vs2012

angular - 使用 cypress 单击特定复选框

java - Powershell 输出格式错误的文件名

ios - 如果结果使用 NSLog 记录,如何创建单元测试

javascript - 如何使用模拟 Firebase 进行 Angular 2 TypeScript 单元测试?

java - 仅使用子字符串 lower 和 upper 方法在 java 中将每个单词的第一个字母大写

java - 将 String 转换为 java 中的运行时代码