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:
assertEquals
von erzeugten Threads in den JUnit-Ausgabesammler für Hauptdateien oder Danke für Ideen!
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%Was Sie beschreiben, ist ConcurrentUnit . Hier ist ein Beispiel:
%Vor%Tags und Links java multithreading testing junit