Тестирование асинхронных методов Vertx и RxJava с использованием mockito
У меня есть класс, который отправляет сообщение на 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 ответ
Единственное, что приходит мне в голову - это проверить с помощью тайм-аута, это означает, что mockito будет ожидать взаимодействия в течение определенного периода времени, а не сразу.
Mockito.verify(dbManager, Mockito.timeout(5000)).....