2016-03-23 11 views
1

Ich habe zwei Microservices mit Java Vertex geschrieben. Sie kommunizieren über Eventbus. Der erste sendet eine Nachricht und der zweite empfängt die Nachricht.So testen Sie Async-Vertex-Eventbus-Handler ohne Antwort senden

Erste Idee: Antworten Sie nur auf Vertx Eventbus-Meldungen im Komponententest.

Ich möchte diese Nachricht testen, ohne Fehler verarbeitet wird und deshalb schreibe ich Unit-Test auf dem zweiten Micro, die die Antwort überprüft

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

Jetzt muss ich die Antwort in meinem Verbraucher senden, aber ich tun möchte, es nur im Test, ich brauche keine Antworten in der Produktion zu senden. Ich möchte CPU und Netzwerk nicht verbrauchen, um Antworten in der Produktion zu senden. Also, was ich suche ist so etwas wie dieses:

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(); 
    } 
}); 

Zweite Idee kam nach cdelmas comment und ist in my own answer

+0

Sieht aus wie die zweite Idee erfüllt, nicht wahr? – cdelmas

Antwort

0

Um Async-Eventbus-Handler ohne Antwort zu testen, müssen Sie Ihre Geschäftslogik in Betrieb nehmen und Ihren Testfall in zwei teilen. Erstens für die Nachrichtenübergabe, zweitens für die Geschäftslogik.

ConsumerVerticle wird wie folgt aussehen:

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(); 
     }); 
    } 
} 

In Asynchron-Test implementieren Mock Ihres Service mit überschriebene Methode methodMayFail(), die von der Asynchron-

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

hält und dann spritzt den mock-Service in verticle

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

Irgendwo in einer anderen Klasse MyServiceTest testen Sie die Implementierung von methodMayFail().

0

Es ist eine sehr schlechte Praxis Code hinzufügen nur für Tests.

Obwohl Sie nicht antworten, gibt es wahrscheinlich etwas, was Sie in dem Verbraucher tun, die überprüft werden kann, wie das Aktualisieren eines Zustands. Das sollten Sie meiner Meinung nach in Ihrem Test bestätigen.

+0

Während ich zustimme, dass das Hinzufügen von Code speziell für Tests eine schlechte Übung ist und Sie mich in die richtige Richtung wiesen, beantwortet dies die Frage nicht vollständig. Das Problem bleibt bestehen: Wie sollte ich Async-Vertex-Eventbus-Handler testen, ohne eine Antwort zu senden? –