Asynchronen Code mit JUnit testen

8

Ich möchte einen Code testen, der auf einer Netzwerkübertragung beruht. Der Code erstellt eine Anforderung und stellt einen Rückruf bereit. Wenn die Anforderung abgeschlossen ist, wird der Rückruf ausgelöst. Ich möchte die Netzwerkübertragung ausspionieren und Thread.sleep verwenden, um eine gewisse Latenz zu simulieren ... aber das wird natürlich den gesamten Test unterbrechen.

Bisher habe ich neue Threads erstellt und CountDownLatch es während des Tests verwendet, um zu verhindern, dass der Test beendet wird, bevor der Callback ausgelöst wird. Mein Schein-Netzwerkobjekt erstellt einen neuen Thread, schläft in diesem Thread und löst dann den Rückruf aus. Das funktioniert eigentlich ziemlich gut, aber das Problem ist, dass alle Assertionsfehler im Callback nicht dem ursprünglichen Junit-Thread gemeldet werden - stattdessen erhalte ich Ausnahmetext auf der Konsole, wo es viel schwieriger zu verstehen und zu verwenden ist.

>

Ich hoffe, es gibt entweder:

  1. Eine Möglichkeit, die Ausgabe von assertEquals von erzeugten Threads in den JUnit-Ausgabesammler für Hauptdateien oder
  2. zu pipen
  3. Eine völlig andere und bessere Methode zum Testen von Thread-Code in JUnit oder
  4. Eine Möglichkeit, asynchronen Code in einem einzelnen Thread zu simulieren

Danke für Ideen!

    
Riley Lark 11.12.2011, 20:12
quelle

2 Antworten

4

Als ich einen ähnlichen asynchronen Mechanismus implementieren musste wie ich, habe ich die abstrakte Klasse AsyncTestCase erstellt, die den Testfehler enthält und die spezielle Methode waitForCallback() bereitstellt. Wenn der asynchrone Task einen Fehler in den erwarteten Ergebnissen findet, wird der Fehler in diese Variable eingefügt. Der Setter ruft notify() für das Objekt auf, das von waitForCallback() verwendet wird. Wenn der Rückruf eintrifft, wird der Test sofort aktiviert. Dann kann ich alle Assertionen aufrufen, einschließlich derjenigen, die von der asynchronen Task gespeichert wurden.

Und vergessen Sie nicht, Ihre Tests mit einem Timeout zu versehen, um zu verhindern, dass sie für immer schlafen:

%Vor%     
AlexR 11.12.2011, 20:24
quelle
1

Was Sie beschreiben, ist ConcurrentUnit . Hier ist ein Beispiel:

%Vor%     
Jonathan 24.07.2015 04:33
quelle

Tags und Links