Тестирование асинхронных методов Vertx и RxJava с использованием mockito - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть класс, который отправляет сообщение на 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 голосов
/ 12 сентября 2018

Единственное, что приходит мне в голову - это проверить с помощью тайм-аута, это означает, что mockito будет ожидать взаимодействия в течение определенного периода времени, а не сразу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...