2016-08-22 3 views
2

Ich habe einen vertx-Unit-Test mit vertx Version 3.3.2 und JUnit Version 4.12. Der folgende Unit-Test nie beendet:Vertex-Unit-Test endet nie

@RunWith(VertxUnitRunner.class) 
public class SomeVerticleTest { 

    private Vertx vertx; 

    @Before 
    public void before(TestContext context) { 
     vertx = Vertx.vertx(); 
     vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess()); // problem is in this line, see answer for solution! 
    } 

    @Test 
    public void doStuff(TestContext context) { 
     String encodedMessage = Json.encode("myMessage"); 
     Async async = context.async(); 
     vertx.eventBus().send("someVerticle", encodedMessage, asyncResult -> { 
      // some context.asserts on the message reply 
      async.complete(); // this line is executed, I can see it in the debugger 
     }); 
    } 
} 

Der Test selbst fein läuft, wird die Nachricht, korrekt verarbeitet vom Handler in SomeVerticle und die Antwort erstellt wird gesendet und gesendet korrekt.

Aber: Obwohl die Methode doStuff ausgeführt wird und ihr Erfolg auf das Async Objekt veröffentlicht wird, läuft der Test einfach für immer, es endet nie. Dies kann durch Hinzufügen einer Nach-Test-Methode verifiziert werden, die mit @After annotiert ist und niemals ausgeführt wird.

Ich habe versucht, den Fehler jetzt für zwei Stunden zu finden, aber ich weiß einfach nicht, was genau das Problem sein könnte, also würde ich mich über jede Hilfe freuen.

[Update] Nach zwei Minuten schlägt der Test mit einer Zeitüberschreitung fehl.

[Update 2] Ich fand das Problem und legte es in eine separate Antwort.

+0

Wo blockiert es? – Taylor

+0

Es führt die async.complete() Zeile aus und danach wird der Prozess nie beendet. In IntelliJ endet der Testprozess nie, wenn er durch maven läuft, wird er auch nie beendet. Es gibt keinen blockierenden Code - zumindest nicht in meinen Klassen - in dem der Prozess hängt. –

+0

Verlässt es Ihre Testmethode? Lege nach 'vertx.eventBus() '' System.out.println' ein. Send (...) 'schau, ob es jemals da ist. – Taylor

Antwort

3

Die Antwort liegt nicht innerhalb der eigentlichen Testmethode, sondern im Setup.

Die folgende Anweisung nicht abgeschlossen:

vertx.deployVerticle(SomeVerticle.class.getName(), r -> context.asyncAssertSuccess()); 

es tatsächlich arbeiten zu erhalten, müssen wir das Async Konstrukt verwenden, wie in der Dokumentation erwähnt here und here.

Eine korrekte Aussage, die auf einen Arbeitstest führt, ist wie folgt:

vertx.deployVerticle(SomeVerticle.class.getName(), context.asyncAssertSuccess()); // note the missing r-> 

Ich hoffe, dass diese Antwort hilft jemand mit einem ähnlichen Problem stecken.

Verwandte Themen