Vertx 单元测试永远不会完成
Vertx unit test never finishes
我使用 vertx 版本 3.3.2 和 JUnit 版本 4.12 进行了 vertx 单元测试。
以下单元测试永远不会完成:
@RunWith(VertxUnitRunner.class)
public class SomeVerticleTest {
private Vertx vertx;
@Before
public void before(TestContext context) {
vertx = Vertx.vertx();
vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess()); // problem is in this line, see answer for solution!
}
@Test
public void doStuff(TestContext context) {
String encodedMessage = Json.encode("myMessage");
Async async = context.async();
vertx.eventBus().send("someVerticle", encodedMessage, asyncResult -> {
// some context.asserts on the message reply
async.complete(); // this line is executed, I can see it in the debugger
});
}
}
测试本身运行良好,消息已发送,由 SomeVerticle
中的处理程序正确处理,回复已正确创建和发送。
但是:虽然方法 doStuff
被执行并且它的成功被发布到 Async
对象,测试只是永远运行,它永远不会结束。这可以通过添加一个后测试方法来验证,用 @After
注释,它永远不会执行。
我已经尝试了两个小时来查找错误,但我根本不知道问题到底是什么,所以我很乐意提供任何帮助。
[更新]
两分钟后,测试因超时而失败。
[更新 2]
我发现了问题并把它放在一个单独的答案中。
答案不在实际测试方法中,而是在设置中。
以下语句未完成:
vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess());
为了让它真正起作用,我们需要使用文档 here and here 中提到的 Async
构造。
导致工作测试的正确陈述如下:
vertx.deployVerticle(SomeVerticle.class.getName(), context.asyncAssertSuccess()); // note the missing r->
我希望这个答案能帮助遇到类似问题的人。
我使用 vertx 版本 3.3.2 和 JUnit 版本 4.12 进行了 vertx 单元测试。 以下单元测试永远不会完成:
@RunWith(VertxUnitRunner.class)
public class SomeVerticleTest {
private Vertx vertx;
@Before
public void before(TestContext context) {
vertx = Vertx.vertx();
vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess()); // problem is in this line, see answer for solution!
}
@Test
public void doStuff(TestContext context) {
String encodedMessage = Json.encode("myMessage");
Async async = context.async();
vertx.eventBus().send("someVerticle", encodedMessage, asyncResult -> {
// some context.asserts on the message reply
async.complete(); // this line is executed, I can see it in the debugger
});
}
}
测试本身运行良好,消息已发送,由 SomeVerticle
中的处理程序正确处理,回复已正确创建和发送。
但是:虽然方法 doStuff
被执行并且它的成功被发布到 Async
对象,测试只是永远运行,它永远不会结束。这可以通过添加一个后测试方法来验证,用 @After
注释,它永远不会执行。
我已经尝试了两个小时来查找错误,但我根本不知道问题到底是什么,所以我很乐意提供任何帮助。
[更新] 两分钟后,测试因超时而失败。
[更新 2] 我发现了问题并把它放在一个单独的答案中。
答案不在实际测试方法中,而是在设置中。
以下语句未完成:
vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess());
为了让它真正起作用,我们需要使用文档 here and here 中提到的 Async
构造。
导致工作测试的正确陈述如下:
vertx.deployVerticle(SomeVerticle.class.getName(), context.asyncAssertSuccess()); // note the missing r->
我希望这个答案能帮助遇到类似问题的人。