Vertx单元测试永远不会完成

时间:2016-08-22 14:14:22

标签: java unit-testing junit reactive-programming vert.x

我有一个vertx单元测试,其中包含vertx版本3.3.2和JUnit版本4.12。 以下单元测试永远不会完成:

@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] 我发现了问题,并将其分成了一个单独的答案。

1 个答案:

答案 0 :(得分:4)

答案不在实际测试方法范围内,而是在设置中。

以下声明未完成:

vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess());

为了让它真正有效,我们需要使用文档herehere中提到的Async构造。

导致工作测试的正确陈述如下:

vertx.deployVerticle(SomeVerticle.class.getName(), context.asyncAssertSuccess()); // note the missing r-> 

我希望这个答案有助于某人遇到类似的问题。