Rx.io和junit测试

Rx.io和junit测试,junit,rx-java2,vert.x,Junit,Rx Java2,Vert.x,在我的业余时间,我喜欢vertx.io。刚才我正在从普通的vertx切换到rxjava2版本(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, quer

在我的业余时间,我喜欢
vertx.io
。刚才我正在从普通的vertx切换到rxjava2版本(
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
),或者我没有使用正确的
VertxUnitRunner

我做错了什么?我搜索了一段时间但没有成功,是否有关于vertx.io rxjava2和测试的示例/文档?

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

JsonArray(msg.result().body().toString())
…无法将响应正文反序列化为JSON数组。要验证这一点,请注释掉整个断言,并查看测试是否在之后完成。如果是这样的话,那应该缩小这一特定问题的范围

值得注意的是,由于您使用的是Rx版本的API,因此可以使用标准Rx类型(而不是
处理程序
)表示异步源。沿着这些行重写的测试(减去
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
        );
  }

}
我希望这有助于澄清问题