2016-09-21 3 views
1

私はVert.x 3で初めてです。単純なイベントハンドラの単体テストを作成しようとしています。今、私がしようとしているのは、テスト中のVerticleがMockitoを使ってモックとして作成された正しいコンポーネントに委譲することを確認することだけです。Vert.xで(イベントバスから)ユニットテストイベントハンドラをどのようにするのですか?

私のテストコードのようなものになります。

@Rule 
public final RunTestOnContext vertxRule = new RunTestOnContext(); 

@Before 
public void setUp(TestContext context) { 
    vertx = vertxRule.vertx(); 
    //verticle is set up with mock delegate before deployment 
    vertx.deployVerticle(verticle); 
} 

@After 
public void tearDown(TestContext context) { 
    vertx.close(context.asyncAssertSuccess()); 
} 

@Test 
public void testDelegate(TestContext context) { 
    EventBus eventBus = vertx.eventBus(); 
    Event event = new Event("id", "description") 
    eventBus.publish("event.channel", Json.encode(event)); 

    //Mockito.verify 
    verify(delegate).invokeMethod(anyString(), anyString()); 
} 

Veticleは、次のようなコードが含まれています:

private Delegate delegate; 

@Override 
public void start(Future<Void> future) throws Exception { 
    vertx.eventBus().consumer("event.channel", message -> { 
     logger.info("received!"); 
     Event event = Json.decodeValue(message.body().toString(), Event.class); 
     delegate.invokeMethod(event.getId(), event.getDescription()); 
    }); 
} 

しかし、私はテストを実行するたびに、私は常にエラーが言ってますがモックは呼び出されていません。私はモックオブジェクトが適切に注入されていることを確信しています。なぜなら、私がイベントバス構造の外でそれを呼び出すと、テストに合格するからです。また、コードはreceived!の情報を記録するので、テストの実行がその時点に達していると確信しています。テストの最後に、モックオブジェクトとのやりとりがないとレポートがなぜ言ったのか分かりません。

答えて

2

検証は、Mockが呼び出される前に実行されます。確認する前に待つテストでは、非同期が必要です。

次に、モックを呼び出した後、あなたのverticleは、受信したメッセージに返信する必要があります。

編集応答なしについてコメントした後

が、私は同期のためのグローバル変数(醜い)を使用して、次のコードを試してみました(これはio.vertx.core.Futureであることに注意してください):

@RunWith(VertxUnitRunner.class) 
public class StackTest { 

    private Vertx vertx; 
    public static Future<String> synchronisation = Future.future(); 

    @Before 
    public void setUp(TestContext context) { 
     vertx = Vertx.vertx(); 
     vertx.deployVerticle(new StackVerticle()); 
    } 

    @Test 
    public void testPublish(TestContext context){ 
     vertx.eventBus().publish("topic","message"); 
     Async async = context.async(); 
     synchronisation.setHandler(event -> async.complete()); 
     async.await(); 
    } 
} 

とテスト垂直方向の(synchronization.completeがあなたのモックによってトリガされなければならない):私は答えるために私のverticleを必要としない

public class StackVerticle extends AbstractVerticle { 
    @Override 
    public void start() throws Exception { 
     vertx.eventBus().consumer("topic",received ->{ 
      System.out.println("received"); 
      StackTest.synchronisation.complete("done"); 
     }); 
    } 
} 
+0

。 –

+1

これは問題です。 eventbus.publish()はコンシューマに非同期的に通知するので、テストの次のjava文(Mockito.verify)で実行が継続されます。デリゲートが呼び出された後、この検証を実行する方法を見つける必要があります。 – Alibi

+0

新しいコードで自分の答えを編集しました – Alibi

関連する問題