Rx-fied vertx.io 和 junit 测试

Rx-fied vertx.io and junit testing

业余时间我很喜欢 vertx.io。刚才我从 plain 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(); 指令命中,测试不会 return 而是挂起。可能是因为我将 io.vertx.reactivex.coreio.vertx.core 混合在一起(例如:io.vertx.reactivex.core.Vertxio.vertx.core.TestContex)或者我没有使用正确的 VertxUnitRunner。 我究竟做错了什么?找了一段时间没有成功,有没有example/doc关于vertx.io rxjava2和testing的?

我能够重现测试问题 "hanging" 当这个位:

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

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

值得注意的是,由于您使用的是 API 的 Rx 化版本,您可以使用标准 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
        );
  }

}

我希望这有助于解决问题![​​=14=]