Vertx.io核心与jUnit中的reactx verticle用法

时间:2019-03-27 14:02:44

标签: java testing junit vert.x

在我的项目中,几乎所有导入都依赖于io.vertx.reactivex.core.Vertx包的导入,有效地使整个项目使用Vertx及其顶点的reactivex版本(而不是core / vanilla版本)。根据这个documentation,我开始对我们的应用程序进行单元测试,并使其与JUint很好地兼容,需要进行以下设置才能使用JUnit并在正确的线程和顶点上下文中运行测试用例:< / p>

@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的正确实例,因为包RunTestOnContext中仅存在io.vertx.ext.unit.junit的一个定义并产生了io.vertx.core.Vertx实例,该实例与{{ io.vertx.reactivex.core.Vertx正在使用的1}}。其他一些测试实用程序(例如TestContext)在TestClass程序包reactivex中具有其等效项,但是io.vertx.reactivex.ext.unit.TestContext似乎不是这种情况。

问题是如何在测试上下文中正确获取RunTestOnContext实例以确保线程和上下文的一致性?

2 个答案:

答案 0 :(得分:1)

vertx-unit 项目仅与 vertx-core 相关。并且不依赖于 vertx-rx-java 。这是可以理解的。因此,如您所见,RunTestOnContext是使用io.vertx.core.Vertx构建的。

您可以将vertx.getDelegate()io.vertx.reactivex.core.Vertx下调到io.vertx.core.Vertx。 Bu不能在相反的方向上工作。

因此,最好的选择是复制RunTestOnContext的代码并为其创建反应式版本。 (最快的方法是将导入更改为io.vertx.reactivex.core.Vertx,并在访问它的地方使用vertx.getDelegate()。)

答案 1 :(得分:0)

通过rxVertx = Vertx.vertx();获取RxVertx实例,并通过rxVertx.getDelegate();获取vertx实例。这是完整的代码段:

@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());
   }
}