Mockito 验证异步方法

Mockito verify asynchronous methods

我有一个方法需要编写测试(我使用 instrumented androidTest,但这也发生在 JVM 单元测试中):

void fooNeedToBeTested(String paramString) {
    if(paramString.isEmpty())
        return

    // queue Runnable in worker thread to do something
    BackgroundWorker.queueTask(new Runnable() {
        @Override
        public void run() {
            repository.doSomething(paramString);
        }
    });
}

我需要验证 doSomething() 被调用所以我写了一个单元测试:

@Test
void testVerifyAsyncCallback() {
    presenter.fooNeedToBeTested("string args");

    Mockito.verify(repository).doSomething("string args");
}

但问题是:在run()方法内部的异步代码之前执行的测试完成已经到达。然后 Mockito 无法验证它是否为 运行。

那么如何让测试运行ner等待异步代码执行完毕,然后通知Mockito去验证呢?

看来我们有 2 个解决方案:

  • 首先是用timeout()

    验证
  • 其次是创建一个“假的”BackgroundWorker(在 src/test 文件夹中)以直接调用 Runnable#run(),而无需排队进入后台线程。