2016-03-23 16 views
1

私はjavaのvertxで書かれた2つのマイクロサービスを持っています。イベントバス経由で通信します。 最初にメッセージを送信し、2番目にメッセージを受信します。応答を送信せずに非同期vertxイベントバスハンドラをテストする方法

最初のアイデア:ユニットテストでは、Vertxイベントバスメッセージに返信します。私はそのメッセージをテストしたい

はエラーなしに処理されているので、私は返事

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

をチェック二microserviceにユニットテストを書く今、私は私の消費者に返信する必要がありますが、私がやりたいですそれはテストでのみ、私は生産で返信を送る必要はありません。私は生産の応答を送るために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(); 
    } 
}); 

セカンドアイデアcdelmas comment後に来て、唯一のテストのためにコードを追加するには非常に悪い習慣ですmy own answer

+0

第2の考えが実現しているように見えますか? – cdelmas

答えて

0

応答なしで非同期イベントバスハンドラをテストするには、ビジネスロジックを抽出してテストケースを2つに分割する必要があります。最初にメッセージを渡すために、ビジネスロジックのために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(); 
     }); 
    } 
} 

非同期テストで

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

を非同期を開催しますオーバーライドされたメソッドmethodMayFail()を使用してサービスのモックを実装し、その後、垂直方向の

にモックサービスを注入します
MockService service = new MockService(context.async()); 
ConsumerVerticle consumerVerticle = new ConsumerVerticle(service); 
... 
eventbus.send("address", message) 

別のクラスのどこかMyServiceTestmethodMayFail()の実装をテストします。

0

です。

あなたは返信しませんが、何らかの状態を更新するなど、確認できる消費者にはおそらくあります。これは私の意見では、あなたのテストで主張する必要があります。

+0

テスト専用のコードを追加することは悪い習慣であり、正しい方向に向けることに同意しましたが、これは完全に問題に答えるものではありません。問題は残っています。回答を送信せずに非同期のVertxイベントバスハンドラをどのようにテストすればよいですか。 –

関連する問題