代码之家  ›  专栏  ›  技术社区  ›  Francesco

Rx-fied vertx.io和junit测试

  •  0
  • Francesco  · 技术社区  · 6 年前

    我爱你 vertx.io 在我的业余时间。刚才我正从普通的vertx切换到rxjava2 fied( vertx-rx-java2 , 3.5.1 )api版本和我的 VertxUnitRunner 测试不再完成:

    @Test
    public void computeSomethingByNullPlan(TestContext ctx) {
     query = null;
     Async async = ctx.async();
     vertx.eventBus().send(HANDLER_ADDRESS, query,
     new DeliveryOptions().addHeader("action", ACTION), msg -> {
         if (msg.failed())
           log.error(msg.cause());
         ctx.assertTrue(msg.succeeded());
         ctx.assertTrue(new 
         JsonArray(msg.result().body().toString()).isEmpty());
         async.complete();
     });
    }
    

    测试运行良好,但只有一次 async.complete(); 指令被命中测试不返回但挂起。也许是因为我在混合 io.vertx.reactivex.core io.vertx.core 一起(例如: io.vertx.reactivex.core.Vertx io.vertx.core.TestContex )或者我没有用正确的 垂直硝石 . 我做错什么了?我搜索了一段时间,但是没有成功,有没有关于vertx.io rxjava2和测试的示例/文档?

    1 回复  |  直到 6 年前
        1
  •  0
  •   homerman    6 年前

    我能够重现测试“挂起”的问题,当这一点:

    JsonArray(msg.result().body().toString())
    

    …无法将响应体反序列化为JSON数组。要验证这一点,请注释掉整个断言并查看测试是否在之后完成。如果是这样,那就应该缩小这一具体问题的范围。

    值得注意的是,由于您使用的是Rx版本的API,因此可以使用标准Rx类型(而不是 Handler ). 你的测试按照这些行重写(减去 JsonArray 可能看起来像这样:

    import io.vertx.ext.unit.Async;
    import io.vertx.ext.unit.TestContext;
    import io.vertx.ext.unit.junit.VertxUnitRunner;
    import io.vertx.reactivex.core.Vertx;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    @RunWith(VertxUnitRunner.class)
    public class Blah {
    
      private Vertx vertx;
    
      @Before
      public void setUp(TestContext context) {
        vertx = Vertx.vertx();
        vertx.eventBus().consumer("HANDLER_ADDRESS").handler(message -> {
          message.reply("PONG!");
        });
      }
    
      @Test
      public void computeSomethingByNullPlan(TestContext context) {
        final String query = "PING?";
    
        final Async async = context.async();
    
        vertx.eventBus().rxSend("HANDLER_ADDRESS", query)
            .subscribe(
                message -> {
                  context.assertEquals("PONG!", message.body().toString());
    
                  async.complete();
                },
                context::fail
            );
      }
    
    }
    

    我希望这有助于澄清事情!