私は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!
の情報を記録するので、テストの実行がその時点に達していると確信しています。テストの最後に、モックオブジェクトとのやりとりがないとレポートがなぜ言ったのか分かりません。
。 –
これは問題です。 eventbus.publish()はコンシューマに非同期的に通知するので、テストの次のjava文(Mockito.verify)で実行が継続されます。デリゲートが呼び出された後、この検証を実行する方法を見つける必要があります。 – Alibi
新しいコードで自分の答えを編集しました – Alibi