Ядро Vertx.io против использования вертикта реактива в jUnit - PullRequest
1 голос
/ 27 марта 2019

В моем проекте в основном весь импорт ретранслируется при io.vertx.reactivex.core.Vertx импорте пакетов, эффективно заставляет весь проект использовать reactivex (не core / vanilla) версию Vertx и ее версии. Я начал немного тестировать наше приложение и сделать так, чтобы он хорошо работал с JUint, в соответствии с этой документацией необходима следующая настройка, чтобы использовать JUnit и запускать тестовые примеры в правильном контексте потока и вертикали. :

@RunWith(VertxUnitRunner.class) /* Set the runner */
public class DaoTest {

    @Rule /* Define rule to get vertx instance in test */
    public RunTestOnContext rule = new RunTestOnContext();

   @Test
    public void exampleTest(TestContext context) {
       TestClass t = new TestClass(rule.vertx());
   }
}

определение TestClass следующее:

import io.vertx.reactivex.core.Vertx; /* Mind here */
public class TestClass {

    public TestClass(Vertx vertx) {
        /* Something */
    }

Я не могу предоставить правильный экземпляр Vertx, поскольку в пакете io.vertx.ext.unit.junit существует только одно определение RunTestOnContext, которое создает экземпляр io.vertx.core.Vertx, что несовместимо с io.vertx.reactivex.core.Vertx, используемым TestClass. Некоторые другие тестовые утилиты, такие как TestContext, имеют свои эквиваленты в reactivex пакетах io.vertx.reactivex.ext.unit.TestContext, но, похоже, это не относится к RunTestOnContext.

Вопрос заключается в том, как правильно получить io.vertx.reactivex.core.Vertx экземпляр в тестовом контексте, чтобы обеспечить согласованность потоков и контекста?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Проект vertx-unit имеет только зависимость от vertx-core . И не зависит от vertx-rx-java . И это понятно. Поэтому RunTestOnContext строится с использованием io.vertx.core.Vertx, как вы видите.

Вы можете опустить с помощью vertx.getDelegate() от io.vertx.reactivex.core.Vertx до io.vertx.core.Vertx. Бу, который не работает в обратном направлении.

Поэтому ваш лучший вариант - скопировать код RunTestOnContext и создать его версию реактивного. (Самый быстрый способ - просто изменить импорт на io.vertx.reactivex.core.Vertx и использовать vertx.getDelegate() там, где к нему осуществляется доступ.)

0 голосов
/ 28 марта 2019

Получить экземпляр RxVertx rxVertx = Vertx.vertx(); и экземпляр vertx rxVertx.getDelegate();.Вот полный фрагмент кода:

@RunWith(VertxUnitRunner.class)
public class MyVerticleTest {

   protected Vertx vertx;

   @Before
   public void setUp(TestContext context) {
      rxVertx = Vertx.vertx();
      vertx = rxVertx.getDelegate();
      Async async = context.async(1);
      RxHelper.deployVerticle(rxVertx, new MyVerticle())
            .subscribe(res -> async.countDown(), err -> {
               throw new RuntimeException(err);
            });
   }

   @Test
   public void my_test(TestContext context) {
      Async async = context.async();
      rxVertx.eventBus().rxSend("address", dataToSend)
           // .flatMap()
            .subscribe(receivedData -> {
                // assert what you want;
                 async.complete(); 
            }, context::fail);
   }

   @After
   public void tearDown(TestContext context) {
      client.close();
      rxVertx.close(context.asyncAssertSuccess());
   }
}
...