Как написать тестовый пример Junit для метода запуска потребителя Verticle в vert.x?

Я реализовал одну статью, как указано ниже. Вертикаль работает как положено. Теперь я пытаюсь написать тестовый пример Junit для этой Verticle, который мог бы проверить метод запуска, метод обработчика handleRequest () и метод getSomeData () внутри обработчика, который возвращает Future. Подойдет либо один тестовый пример для проверки всех трех методов, либо отдельный тестовый пример для проверки отдельного метода. Я знаю, как писать тестовые примеры Junit для синхронного кода, но понятия не имею, как именно писать TC Junit для Verticle в vert.x, который является асинхронным. Может ли кто-нибудь направить меня сюда? У меня также есть вертикаль маршрутизатора, из которой я отправляю сообщение этой потребительской статье MyVerticle, но я думаю сначала написать тестовые примеры Jnuit для этой потребительской верстилки. Пожалуйста помоги.

@Component
public class MyVerticle extends AbstractVerticle{

@Override
public void start() throws Exception {
    super.start();
    vertx.eventBus().<String>consumer("address.xyz").handler(handleRequest());
}

private Handler<Message<String>> handleRequest() {
    return msg -> {
        getSomeData(msg.body().toString())
        .setHandler(ar -> {
            if(ar.succeeded()){
                msg.reply(ar.result());
            }else{
                msg.reply(ar.cause().getMessage());
            }
         });
    };
}

private Future<String> getSomeData(String inputJson) {
    Promise<String> promise = Promise.promise();
    promise.complete("Returning Data");
    return promise.future();    
 }

}


person Nags    schedule 09.12.2019    source источник


Ответы (1)


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

import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class MainVerticleTest {

  private Vertx vertx;

  @Before
  public void setup(TestContext ctx){
    Async async = ctx.async();
    this.vertx = Vertx.vertx();
    vertx.deployVerticle(MyVerticle.class.getName(), h -> {
      if(h.succeeded()){
        async.complete();
      }else{
        ctx.fail();
      }
    });
  }

  @Test
  public void test_consumption(TestContext ctx) {
    Async async = ctx.async();
    vertx.eventBus().request("address.xyz","message", h ->{
      if(h.succeeded()){
        ctx.assertEquals("Returning Data",h.result().body().toString());
        async.complete();
      }else{
        ctx.fail(h.cause());
      }
    });
  }
}

person taygetos    schedule 09.12.2019
comment
Большое спасибо! Это сработало идеально. Всего одно небольшое обновление в нем. ctx.assertEquals (возвращение данных, h.result (). body (). toString ()); Спасибо еще раз ! - person Nags; 09.12.2019
comment
В том же коде тестового примера, как бы вы создали фиктивный экземпляр компонента Autowired в Verticle? Я пытаюсь создать, но не получаю имитацию такого компонента с автоматическим подключением. Всегда получаю null. Однако в коде, отличном от vert.x, он работает отлично. Для удобства я создал для него отдельный вопрос. Цените вашу помощь и в этом вопросе. Вы можете найти его в stackoverflow.com/questions/59258029/ - person Nags; 10.12.2019