2016-08-22 5 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時間の間エラーを見つけようとしましたが、問題の正確さがわからないので、私はどんな援助にも満足しています。

[更新] 2分後、テストはタイムアウトして失敗します。

[更新2] 問題を見つけて別の回答に入れました。

+0

どこがブロックされていますか? – Taylor

+0

これはasync.complete()行を実行し、その後は処理が完了しないだけです。 IntelliJでは、テストプロセスは完了しません.Mavenを実行すると、テストプロセスは終了しません。プロセスがハングアップするブロックコードは、少なくとも私のクラスにはありません。 –

+0

テストメソッドを終了していますか? 'vertex.eventBus()。send(...)'の後ろに 'System.out.println'を置いてください。 – Taylor

答えて

3

答えは実際のテスト方法ではなく、セットアップに含まれています。

次の文は完了しません:

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

は、それが実際に作業を取得するには、我々はドキュメントherehereで述べたようにAsync構文を使用する必要があります。次のように

作業テストにつながる正しい文は次のとおりです。

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

私はこの回答が同様の問題で立ち往生している誰かに役立ちます願っています。

関連する問題