Тестирование асинхронных методов 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)).....

Другие вопросы по тегам