我在业余时间爱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
),或者也许我没有使用正确的VertxUnitRunner
。
我究竟做错了什么?我搜索了一段时间,但没有成功,是否有任何有关vertx.io rxjava2和测试的示例/文档?
答案 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
);
}
}
我希望这有助于清理问题!