Модульный тест Vertx никогда не заканчивается

У меня есть модульный тест vertx с vertx версии 3.3.2 и JUnit версии 4.12. Следующий модульный тест никогда не завершается:

@RunWith(VertxUnitRunner.class)
public class SomeVerticleTest {

    private Vertx vertx;

    @Before
    public void before(TestContext context) {
        vertx = Vertx.vertx();
        vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess()); // problem is in this line, see answer for solution!
    }

    @Test
    public void doStuff(TestContext context) {
        String encodedMessage = Json.encode("myMessage");
        Async async = context.async();
        vertx.eventBus().send("someVerticle", encodedMessage, asyncResult -> {
            // some context.asserts on the message reply
            async.complete(); // this line is executed, I can see it in the debugger
        });
    }
}

Сам тест проходит нормально, сообщение отправлено, правильно обработано обработчиком в SomeVerticle, и ответ создается и отправляется правильно.

Но: Несмотря на то, что метод doStuff выполняется и его успех публикуется в Async объекте, тест запускается бесконечно и никогда не заканчивается. Это можно проверить, добавив метод после проверки, помеченный знаком @After, который никогда не выполняется.

Я пытался найти ошибку в течение двух часов, но я просто не знаю, в чем именно может быть проблема, поэтому буду рад любой помощи.

[update] Через две минуты тест не проходит с тайм-аутом.

[update 2] Я нашел проблему и выделил ее в отдельный ответ.


person Dominik Sandjaja    schedule 22.08.2016    source источник
comment
Где это блокировка?   -  person Taylor    schedule 22.08.2016
comment
Он выполняет строку async.complete (), и после этого процесс просто никогда не завершается. В IntelliJ процесс тестирования никогда не заканчивается, при запуске через maven он также никогда не заканчивается. Нет кода блокировки - по крайней мере, в моих классах - в котором процесс зависает.   -  person Dominik Sandjaja    schedule 22.08.2016
comment
Выходит из вашего метода тестирования? Поставьте System.out.println после vertx.eventBus().send(...), посмотрите, дойдет ли он когда-нибудь.   -  person Taylor    schedule 22.08.2016
comment
Да, он выходит из метода тестирования, я могу сделать то, что вы рекомендуете ;-)   -  person Dominik Sandjaja    schedule 22.08.2016
comment
vertx.io/docs/vertx-core/java/#_causing_vert_x_to_exit   -  person Taylor    schedule 22.08.2016
comment
Боюсь, что это не сработает, когда я добавлю больше тестов. Куда бы я положил это .close()?   -  person Dominik Sandjaja    schedule 22.08.2016


Ответы (1)


Ответ не в рамках фактического метода тестирования, а в настройке.

Следующая инструкция НЕ завершается:

vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess());

Чтобы заставить его работать, нам нужно использовать конструкцию Async, как указано в здесь и здесь.

Правильное утверждение, которое приводит к рабочему тесту, выглядит следующим образом:

vertx.deployVerticle(SomeVerticle.class.getName(), context.asyncAssertSuccess()); // note the missing r-> 

Надеюсь, этот ответ поможет кому-то столкнуться с подобной проблемой.

person Dominik Sandjaja    schedule 23.08.2016