Правильный способ провалить юнит-тест из обратного вызова, используя Vertx Unit - PullRequest
0 голосов
/ 19 ноября 2018

С учетом следующего модульного теста, в котором используется Vertx Unit инфраструктура тестирования:

@RunWith(VertxUnitRunner.class)
public class VertxUnitTest {

    private Vertx vertx;

    @Rule
    public RunTestOnContext rule = new RunTestOnContext(new VertxOptions().setClustered(false)
            .setClusterManager(new HazelcastClusterManager()).setMaxEventLoopExecuteTime(2000000000000L)
            .setMaxWorkerExecuteTime(60000000000000L).setBlockedThreadCheckInterval(1000000)
            .setEventBusOptions(new EventBusOptions().setClustered(false).setIdleTimeout(0)));

    @Before
    public void setup() throws Exception {
        io.vertx.core.Vertx v = rule.vertx();
        vertx = Vertx.newInstance(v);
    }

    private class MyVerticle extends AbstractVerticle {}

    @Test
    public void runFlow_correctMessage_stepsCalledInCorrectOrder(TestContext context) {
        Async async = context.async();

        vertx.getDelegate().deployVerticle(new MyVerticle(), new DeploymentOptions().setWorker(true), c -> {
            c.cause();
            vertx.eventBus().<Object>send("", new JsonObject(), new DeliveryOptions(), rpl -> {
                async.complete();
                fail();

            });
        });
    }
}

вызов fail() вызывает исключение для консоли, но на самом деле это не сбой самого теста, который успешно завершается и имеет зеленый цвет.

То же самое верно при работе с Mockito . Я могу успешно проверить поведение вертикали и ее зависимостей, используя макеты, но даже если утверждения Мокито не пройдены, сам тест все равно будет пройден. Ошибка вызова объекта vertx TestContext - context.fail() - также не провалит тест.

Основная проблема заключается в следующем: любой вызов fail() после async.complete() не провалит тест, только консоль покажет ошибку. Но без вызова async.complete() код в статье (который вызывается при использовании из шины событий) не будет работать до вызова тестовых утверждений.

Без вызова async.complete() тест будет казаться никогда не завершенным.

Какой правильный подход к этому?

Спасибо

1 Ответ

0 голосов
/ 20 ноября 2018

правильный подход - вызвать метод TestContext.fail(), например:

@Test
public void runFlow_correctMessage_stepsCalledInCorrectOrder(TestContext context) {
    Async async = context.async();

    vertx.getDelegate().deployVerticle(new MyVerticle(), new DeploymentOptions().setWorker(true), c -> {
        if(c.succeeded()) {
            vertx.eventBus().<Object>send("", new JsonObject(), new DeliveryOptions(), rpl -> {
                if(rpl.succeeded()) {
                    // make assertions based on reply contents, and then...
                    async.complete();

                } else {
                    context.fail(rpl.cause());
                }
            });

        } else {
            context.fail(c.cause());
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...