У меня есть класс, который отправляет сообщение на 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 ожидал завершения всех зависимых асинхронных потоков?
Спасибо