Vertx 单元测试永远不会完成

Dom*_*aja 2 java junit unit-testing reactive-programming vert.x

我有 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
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

测试本身运行良好,消息被发送,由处理程序正确处理,SomeVerticle并正确创建和发送回复。

但是:虽然方法doStuff被执行并且成功发布到Async对象,但是测试只是永远运行,它永远不会结束。这可以通过添加一个 after-test 方法来验证,用@After它注释,从不执行。

我已经尝试找出错误两个小时了,但我根本不知道问题到底是什么,所以我很乐意提供任何帮助。

[更新] 两分钟后,测试失败并超时。

[更新 2] 我发现了问题并将其放入单独的答案中。

Dom*_*aja 6

答案不在实际的测试方法中,而在设置中。

以下语句不完整:

vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess());
Run Code Online (Sandbox Code Playgroud)

为了让它真正工作,我们需要使用这里这里Async的文档中提到的构造。

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

vertx.deployVerticle(SomeVerticle.class.getName(), context.asyncAssertSuccess()); // note the missing r-> 
Run Code Online (Sandbox Code Playgroud)

我希望这个答案可以帮助那些被类似问题困住的人。