繁体   English   中英

jUnit 中的 Vertx.io 核心与 reactx 垂直使用

[英]Vertx.io core vs reactivex verticle usage in jUnit

在我的项目中,大部分导入都在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.junitRunTestOnContext存在io.vertx.ext.unit.junit一个定义并生成io.vertx.core.Vertx实例,该实例与io.vertx.reactivex.core.Vertx不兼容TestClass正在使用的io.vertx.reactivex.core.Vertx 其他一些测试实用程序,如具有的TestContext它们的等同于reactivexio.vertx.reactivex.ext.unit.TestContext ,但这似乎不适合的情况下RunTestOnContext

问题是如何在测试上下文中正确获取io.vertx.reactivex.core.Vertx实例以仍然确保线程和上下文一致性?

vertx-unit项目只依赖于vertx-core 并且不依赖于vertx-rx-java 这是可以理解的。 因此, RunTestOnContext使用内置io.vertx.core.Vertx正如你看到的。

您可以使用vertx.getDelegate()io.vertx.reactivex.core.Vertx向下转换为io.vertx.core.Vertx 但这在相反的方向上不起作用。

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

通过rxVertx = Vertx.vertx();获取 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());
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM