2017-01-09 95 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();,我得到警告消息到控制檯,但問題消失。

那麼,我做錯了什麼?這是一個問題嗎?

回答