RX-fied vertx.io和junit测试

时间:2018-07-29 09:46:21

标签: junit rx-java2 vert.x

我在业余时间爱vertx.io。刚才我从普通vertx切换到rxjava2-fied(vertx-rx-java23.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.coreio.vertx.core混合在一起(例如:io.vertx.reactivex.core.Vertxio.vertx.core.TestContex),或者也许我没有使用正确的VertxUnitRunner。 我究竟做错了什么?我搜索了一段时间,但没有成功,是否有任何有关vertx.io rxjava2和测试的示例/文档?

1 个答案:

答案 0 :(得分:0)

当此位时,我能够重现测试“挂起”的问题:

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

}

我希望这有助于清理问题!