2016-08-22 41 views
2

我有一个vertx版本3.3.2和JUnit版本4.12的vertx单元测试。 以下单元测试从未完成: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] 我发现了问题,并将其放入单独的答案中。

+0

它在哪里阻塞? – Taylor

+0

它执行async.complete()行,在此之后,该进程永远不会结束。在IntelliJ中,测试过程永远不会结束,在运行maven时它也永远不会结束。没有阻止代码 - 至少不是在我的课程中 - 进程挂起。 –

+0

它是否正在退出您的测试方法?在'vertx.eventBus()。send(...)'之后放一个'System.out.println',看它是否到达那里。 – Taylor

回答

3

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

下面的语句没有完成:

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

为了得到它实际工作中,我们需要使用Async结构作为文档herehere提及。

导致工作测试

正确的语句如下:

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

我希望这个答案可以帮助别人被卡住了类似的问题。