2017-01-09 35 views
1

所以这是一个有点偷偷摸摸的一个,它不会发生的100%的时间,但是这是情况:Vertx测试verticle

我创建了一个JUnit集成类,宣布Rule在上下文上运行,然后我从规则中提取vertx对象。然后,我部署新verticles到vertx,如果尝试部署超过〜3-4 verticles我得到这个每个verticle:

Jan 09, 2017 2:43:33 PM io.vertx.core.impl.ContextImpl 
SEVERE: Unhandled exception 
java.lang.IllegalStateException: Result is already complete: succeeded 
    at io.vertx.core.impl.FutureImpl.checkComplete(FutureImpl.java:164) 
    at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:108) 
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:135) 
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:23) 
    at io.vertx.core.eventbus.impl.EventBusImpl.lambda$callCompletionHandlerAsync$2(EventBusImpl.java:340) 
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:316) 
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) 
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:418) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:440) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873) 
    at java.lang.Thread.run(Thread.java:745) 

导致此问题的代码看起来像这样:

@RunWith(VertxUnitRunner.class) 
public class VertxTest { 

    @Rule 
    public RunTestOnContext rule = new RunTestOnContext(Vertx::vertx); 

    @Test 
    public void testLinearExecution(TestContext context) { 
     Vertx vertx = rule.vertx(); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
    } 

} 

这可能取决于在机器上运行它,但我的猜测是,如果它不复制,添加更多的那些家伙,使其更可能:

vertx.deployVerticle(new AbstractVerticle() { 
    @Override 
    public void start() throws Exception { 
     this.vertx.eventBus().consumer("bla", event -> {}); 
    } 
}); 

另一件事提是如果我改变Vertx vertx = rule.vertx();Vertx vertx = Vertx.vertx();,我得到警告消息到控制台,但问题消失。

那么,我做错了什么?这是一个问题吗?

回答