Blog-Logo auf schwarzem Grund mit dem Schriftzug "Discover What's Next in Tech!"

JUnit TestWatcher

Wir zeigen hier, wie man eine JUnit-Erweiterung schreibt, welche Test-Ausführung überwacht. Konkret soll die Ausführung weiterer Tests in einer Test-Klasse verhindert werden, sobald einer der Test-Methoden fehlschlägt.

Hintergrund

Wozu braucht man so etwas?

Wir haben einen Integrationstest, der einen gesamten Workflow abbildet. Die Einzelschritte sind jeweils als eigene Test-Methoden implementiert.
Mittels Order-Annotation werden sie in einer festgelegten Reihenfolge ausgeführt. Natürlich könnten wir auch alle Schritte in eine einzige Test-Methode packen, dann würde auch beim ersten Fehler abgebrochen. Nachteil wäre hier aber, dass wir den Fortschritt nur übers Logging sehen könnten.
Indem wir jeden Schritt als einzelne Test-Methode abbilden, sehen wir direkt in der Entwicklungsumgebung, in welchem Schritt wir uns befinden. Nun macht es aber keinen Sinn, die weiteren Test-Methoden des Integrationstests auszuführen, wenn ein vorhergehender Schritt fehlschlägt. Daher wollen wir in diesem Fall die Ausführung der weiteren Integrationstest-Schritte überspringen.

Herausforderung

Um dies zu realisieren, wollen wir natürlich nicht in jede Test-Methode immer wieder denselben Code einbauen: Per Assumption abfragen, ob bereits ein Fehler aufgetreten ist, Abfangen von Fehlern, Setzen eines Merkers für die Assumption.

Lösung

Daher erstellen wir einfach eine eigene kleine Extension. In dieser implementieren wir das Interface BeforeEachCallback. Dadurch haben wir auch die Methode beforeEach zur Verfügung. In dieser können wir eine Assumption einbauen, welche die aktuelle Test-Methode überspringt, wenn ein Fehler-Flag gesetzt ist. Nun müssen wir noch das Fehler-Flag setzen. Dazu implementieren wir zusätzlich das TestWatcher-Interface. Mit diesem können wir die Testausführung überwachen. Wirklich interessant sind für uns hier nur die Methoden testAborted und testFailed. Hier setzen wir jeweils einfach das Flag anyFailed auf true.

Die Verwendung der Extension ist denkbar einfach. In jeder Unit-Test-Klasse, wo dieses Verhalten gewünscht ist, können wir nun einfach die Extension mit

@ExtendsWith hinzufügen:

 


JUnit 5 Assumptions

JUnit 5 TestWatcher Javadoc

Baeldung – Artikel zu JUnit 5 TestWatcher API

Mehr zu Softwareentwicklung erfahren
Matthias Fischer

Über MICH

Matthias Fischer hat ein Diplom in Allgemeiner Informatik und ist seit 2006 als Software Entwickler bei doubleSlash tätig. Er hat branchenübergreifende Erfahrungen in IT Projekten und arbeitet mit namhaften Kunden wie z.B. Deutsche Post Direkt GmbH, BMW AG, Bundesdruckerei, ZF AG und Zeppelin Systems zusammen. Matthias hat umfangreiches Knowhow in Spring Boot, Java EE und Angular. Sein Einsatzschwerpunkt liegt vorwiegend in der Backend-Entwicklung, seit einiger Zeit gehört jedoch auch die Frontend-Entwicklung mit Angular zu seinen Tätigkeiten. Matthias begeistert sich außerdem für Softwarequalität, automatisierte Test und die agile Entwicklung.

Alle Beiträge von Matthias Fischer

Mehr erfahren

Weitere Infos auf unserer Website und in unserem Newsletter

Pfeil hoch