3

Java vertx で作成された 2 つのマイクロサービスがあります。それらはイベントバスを介して通信します。1 つ目はメッセージを送信し、2 つ目はメッセージを受信します。

最初のアイデア: 単体テストで Vertx イベントバス メッセージにのみ応答します。

メッセージがエラーなしで処理されていることをテストしたいので、返信をチェックする 2 番目のマイクロサービスに単体テストを記述します

eventbus.send("address", message, reply -> {
    if (reply.succeeded()) {
        context.async().complete();
    } else {
        context.fail();
    }});

コンシューマーで返信を送信する必要がありますが、テストでのみ実行したいので、本番環境で返信を送信する必要はありません。本番環境で返信を送信するために CPU とネットワークを消費したくありません。だから私が探しているのは次のようなものです:

vertx.eventBus().consumer("address", handler -> {
    Boolean success = methodMayFail();
    if ( MY_CONTEXT_IS_TEST || HANDLER_IS_LOCAL_AS_I_ONLY_SENT_LOCAL_MESSAGES_FROM_TEST) {
        success ? handler.reply("ok") : handler.fail();
    }
});

2番目のアイデアはcdelmasのコメントの後に来て、私自身の答えにあります

4

2 に答える 2

2

応答なしで非同期イベントバス ハンドラーをテストするには、ビジネス ロジックをサービスに抽出し、テスト ケースを 2 つに分割する必要があります。1 つはメッセージ パッシング、2 番目はビジネス ロジックです。

ConsumerVerticle は次のようになります。

class ConsumerVerticle extends AbstractVerticle {
    // this service is injected somehow, for example as constructor parameter
    private MyService service;
    ...
    public void start() {
        vertx.eventBus().consumer("address", handler -> {
            service.methodMayFail();
        });
    }
}

methodMayFail()非同期テストでは、非同期を保持するオーバーライドされたメソッドを使用してサービスのモックを実装します

class MockService extends MyService() {
    private Async async;
    public MockService(Async async) {
        this.async = async;
    }
    @Override public void methodMayFail() {
        async.complete()
    }
}

そして、モックサービスを垂直に挿入します

MockService service = new MockService(context.async()); 
ConsumerVerticle consumerVerticle = new ConsumerVerticle(service);
...
eventbus.send("address", message)

別のクラスのどこかでMyServiceTestの実装をテストしますmethodMayFail()

于 2016-04-02T13:26:17.053 に答える
0

テストのためだけにコードを追加するのは非常に悪い習慣です。

返信はしませんが、何らかの状態の更新など、確認できることをコンシューマで実行している可能性があります。私の意見では、これがテストで主張すべきことです。

于 2016-03-25T12:34:16.247 に答える