使用Mockito测试异步Vertx和RxJava方法

时间:2018-09-12 12:37:37

标签: mockito rx-java vert.x vertx-verticle

我有一个类,它在vert.x event bus上发送消息,然后处理来自事件总线使用者的答复。当类运行时,它将调用在构造函数或特定方法调用中传递给它的对象上的方法。

为了验证传入对象上的方法确实被调用,使用Mockito对对象进行了模拟。这是测试类的基本结构:

@RunWith(VertxUnitRunner.class)
public class MyTest {

    @Rule
    public RunTestOnContext rule = new RunTestOnContext(new VertxOptions());

    @Test
    public void test(TestContext context) {

       Runnable r = new Runnable() {
          @Override
            public void run() {
                // Create an event bus consumer for testing
                // ...

                // Create the class to be tested
                Dao dao = new Dao();
                DbManager dbManager = Mockito.mock(DbManager.class);
                dao.save(dbManager);
            }
       }

       Thread t2 = new Thread(r);
       t2.start();
       t2.join();

       Mockito.verify(dbManager, ...
       async.complete();
    }
}

这仅在某些时间有效。问题是,当dao类向vert.x event bus发送异步消息并处理响应时,这一切都发生在与join()调用正在等待的线程不同的线程中,因此Mockito.verify可以在vertx管理的线程完成之前发生。

构造这些测试的最佳方法是什么,以便Mockito等待所有相关的异步线程完成?

谢谢

1 个答案:

答案 0 :(得分:1)

我想到的唯一一件事就是验证超时,这意味着Mockito将等待指定的时间段进行交互,而不是立即失败。

Mockito.verify(dbManager, Mockito.timeout(5000)).....