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.core
和 io.vertx.core
混合在一起(例如:io.vertx.reactivex.core.Vertx
和 io.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=]
业余时间我很喜欢 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.core
和 io.vertx.core
混合在一起(例如:io.vertx.reactivex.core.Vertx
和 io.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=]