Einstieg in JUnit 5

Bereits vor einiger Zeit – im September 2017 – ist JUnit 5 erschienen und damit eine von Grund auf überarbeitete Version des Unit-Test-Frameworks.
Dieser Beitrag soll einen tieferen Einblick bieten, insbesondere für diejenigen, die noch mit JUnit 4 (oder sogar JUnit 3) arbeiten und erkennen werden, dass ohne große Hindernisse auf JUnit 5 gewechselt werden kann, ohne alte Tests direkt migrieren zu müssen.
Überblick
Hin und wieder kommt es vor, dass JUnit 5 und JUnit Jupiter synonym verwendet werden. Das ist nicht ganz korrekt, denn JUnit 5 besteht aus drei Teilen, von denen Jupiter nur einer ist:
JUnit Jupiter:
Die API, gegen die wir unsere Tests schreiben und eine Implementierung der JUnit Platform Engine API, die die Tests durchführt.
JUnit Vintage:
Eine Engine-Implementierung, die es erlaubt Tests, die für JUnit 4 oder JUnit 3 geschrieben wurden, auszuführen.
JUnit Platform:
Die bereits genannte API, die alle TestEngines implementieren müssen.
Dependencies mit Gradle und Maven
Aus der veränderten Struktur und der Möglichkeit, alte Tests mit der Vintage Engine auszuführen, ergeben sich mehrere Optionen, ein Projekt mit Gradle oder Maven aufzusetzen.
Die alten JUnit 4 oder JUnit 3 Tests lassen sich mit entsprechender Konfiguration ohne Probleme ausführen, was eine Kombination aus bestehenden, alten Tests und neuen, mit JUnit 5 geschriebenen, ermöglicht.
Gradle
Maven
Unterschiede zu JUnit 4
Wenn bereits mit JUnit 4 gearbeitet wurde, ist der Einstieg in JUnit 5 nicht schwer. Es gibt dennoch einige Änderungen – aber vor allem auch Neuerungen, die beachtet werden sollten.
Annotationen
In diesem Artikel wird nicht auf sämtliche Annotationen eingegangen. Hier nicht aufgeführte Annotationen wie @TestFactory oder @ExtendWith werden Bestandteil eines folgenden Artikels.
JUnit 4
|
JUnit 5
|
Anmerkungen
|
---|---|---|
@Test | @Test |
|
@BeforeClass | @BeforeAll | – |
@AfterClass | @AfterAll | – |
@Before | @BeforeEach | – |
@After | @AfterEach | – |
@Ignored | @Disabled |
|
@Category | @Tag |
|
– | @Tags |
|
– | @DisplayName |
|
@Test
Viele Änderungen gibt Beispiel bei den Annotationen, von denen @Test die wohl wichtigste ist. Hier fehlen die alten Attribute expected und timeout, die jetzt mithilfe der Assertions assertThrows und assertTimeout definiert werden.
Insbesondere das neue Exception-Testing dürfte hier interessant sein. Eine Exception ist in JUnit 5 „nur“ eine weitere Assertion unter vielen und kann in beliebiger Häufigkeit im Test vorkommen. Wenn weitere Bestandteile der Exception geprüft werden sollen, wie z.B. die Message, ist auch das ohne weiteres möglich, da assertThrows die geworfene Exception zurückgibt und somit alle nötigen Informationen zur Verfügung stehen, um weitere Annahmen zu testen.
@Disabled
Die neue Annotation @Disabled ersetzt das bisherige @Ignored. Gänzlich neu sind wohl die Annotationen des Packages org.junit.jupiter.api.condition, die es erlauben, unter bestimmten Bedingungen Tests nicht auszuführen oder überhaupt erst ausführen zu lassen.
@Tag
@Tag ersetzt die alte Annotation @Category aus dem experimental Package. Sie lässt sich bei Bedarf entweder wiederholen oder durch @Tags ersetzen.
Die gesetzten @Tag Annotationen lassen sich dann beispielsweise über Gradle oder Maven herausfiltern.
Die oberen Tests lassen sich mit folgender Gradle-Konfiguration und entsprechenden Command Line Befehlen ausführen:
Fazit
JUnit 5 bietet eine vollständige Überarbeitung des beliebten Unit-Testing-Frameworks, die überzeugt. Es ist möglich, gut strukturierte, leicht lesbare Tests zu schreiben und die gut durchdachte Architektur erlaubt es leicht Anpassungen vorzunehmen oder die Jupiter-Engine komplett zu ersetzen.
Über den Autor

empulse Team
Unser kompetentes und erfahrenes Team von (Java-)Entwickler ist stark in Beratung, technischer Konzeption und zuverlässiger Umsetzung komplexer Projekte. In unseren Reihen haben wir Spezialisten für unterschiedliche Themengebiete, die hier ihr Fachwissen zum Besten geben.