使用 mockito 测试异步 Vertx 和 RxJava 方法
Testing asynchronous Vertx and RxJava methods using mockito
我有一个 class,它在 vert.x event bus
上发送消息,然后处理来自事件总线消费者的回复。当 class 运行时,它会调用在构造函数或特定方法调用中传递给它的对象的方法。
为了验证传入的对象上的方法确实被调用,使用Mockito模拟对象。下面是测试的基本结构 class:
@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
class 向 vert.x event bus
发送异步消息并处理响应时,这一切都发生在与 join()
不同的线程中调用正在等待,因此 Mockito.verify
可能在 vertx 管理的线程完成之前发生。
构建这些测试的最佳方式是什么,以便 Mockito 等待所有依赖的异步线程完成?
谢谢
我唯一想到的就是超时验证,意思是mockito会等待指定的时间进行交互,而不是立即失败。
Mockito.verify(dbManager, Mockito.timeout(5000)).....
我有一个 class,它在 vert.x event bus
上发送消息,然后处理来自事件总线消费者的回复。当 class 运行时,它会调用在构造函数或特定方法调用中传递给它的对象的方法。
为了验证传入的对象上的方法确实被调用,使用Mockito模拟对象。下面是测试的基本结构 class:
@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
class 向 vert.x event bus
发送异步消息并处理响应时,这一切都发生在与 join()
不同的线程中调用正在等待,因此 Mockito.verify
可能在 vertx 管理的线程完成之前发生。
构建这些测试的最佳方式是什么,以便 Mockito 等待所有依赖的异步线程完成?
谢谢
我唯一想到的就是超时验证,意思是mockito会等待指定的时间进行交互,而不是立即失败。
Mockito.verify(dbManager, Mockito.timeout(5000)).....