JUnit 5 setzt auf Java 8 und verbessert die Anbindung von Erweiterungen

Die aktuelle Version des Java-Test-Frameworks besteht aus mehreren Modulen, die in drei Unterprojekte aufgeteilt sind, mit denen sich Tests flexibler handhaben lassen. Außerdem haben die Macher die Anbindung von Erweiterungen grundlegend geändert.

In Pocket speichern vorlesen Druckansicht
Java: JUnit 5 setzt auf Java 8 und bietet bessere Erweiterungsmöglichkeiten
Lesezeit: 3 Min.

Nach fast zwei Jahren Entwicklungsarbeit ist nun JUnit 5 erschienen. Die Macher haben das Java-Test-Framework von Grund auf neu entwickelt, um Altlasten abzustoßen. Dazu gehört vor allem die problematische Erweiterung von JUnit 4 durch Runner auf der einen und Rules auf der anderen Seite. Außerdem setzt das Framework nun auf Java 8 als zugrunde liegende Plattform. So lassen sich unter anderem Lambdas verwenden

Anders als der Vorgänger ist JUnit 5 nun modular aufgebaut. Es besteht aus den drei Unterprojekten Platform, Jupiter und Vintage. JUnit Platform ist die Grundlage zum Start von Tests und soll die Brücke zu Build-Werkzeugen und Entwicklungsumgebungen bilden. Über das Interface TestEngine bietet sie eine API zum Entwickeln von Tests. Schließlich bietet sie die Möglichkeit, ein Konsolenfenster zu öffnen, um Tests von der Kommandozeile anzustoßen. Es gibt auch JUnit-4-basierte Runner. Das Unterprojekt JUnit Vintage bietet zudem eine TestEngine, die passend zum Namen Tests ermöglicht, die auf JUnit 3 oder 4 basieren.

JUnit Jupiter verbindet das Programmiermodell von JUnit 5 mit dem neuen Erweiterungsmodell. Letzteres ist wohl die spannendste Neuerung und war eine wesentliche Motivation für das Team, das Basissystem neu zu entwickeln: JUnit 4 bietet die beiden konkurrierende Erweiterungsmöglichkeiten Runner und Rules, die unterschiedliche Stärken und Schwächen haben und eben nicht einheitlich und beliebig austauschbar sind.

Stattdessen kennt JUnit 5 eine einheitliche Extension-API. Entwickler können Erweiterungen über @ExtendWith registrieren und dabei mehrere Extensions miteinander verknüpfen:

@ExtendWith({ FooExtension.class, BarExtension.class })
class MyTests {
// ...
}

Neben dieser deklarativen Erweiterung bietet JUnit Jupiter die Option der Registrierung von Erweiterungen über java.util.ServiceLoader, um die passenden Erweiterungen direkt aus dem classpath zu laden. Die Extension-API bietet zudem mit ExecutionCondition eine Möglichkeit, Bedingungen für die Ausführungen von Tests zu definieren. Zudem besitzen Tests einen wohldefinierten Lebenszyklus, der aus den folgenden Schritten besteht:

  1. BeforeAllCallback
  2. BeforeEachCallback
  3. BeforeTestExecutionCallback
  4. AfterTestExecutionCallback
  5. AfterEachCallback
  6. AfterAllCallback
Mehr Infos

Java 2017

Mehr Informationen zu JUnit 5 sowie zu Java 9, Java EE 8 und aktuellen Entwicklungen im Java-Umfeld gibt es in dem iX-Developer-Sonderheft, das unter anderem im heise Shop erhältlich ist.

IntelliJ IDEA arbeitet bereits seit Version 2016.2 mit JUnit 5 zusammen. JetBrains liefert das Framework als Bestandteil der IDE aus, aber Entwickler können manuell neuere Varianten installieren. Eclipse Oxygen (4.7) hat die Unterstützung noch als Beta-Funktion gekennzeichnet. Bereits beim Release der IDE im Juni kündigten die Entwickler des Werkzeugs aber vollständigen Support an, sobald die fertige Version erscheint. Für Gradle haben die JUnit-Macher ein rudimentäres Plug-in veröffentlicht, und für Maven existiert ein Tool zur Anbindung über Surefire.

Weitere Details lassen sich dem GitHub-Repository sowie der ausführlichen Dokumentation von JUnit 5 entnehmen. Ersteres enthält zudem den Quellcode, Letztere Hinweise zur Migration von älteren JUnit-Versionen. Aufgrund der Umstellung benötigt das Release mindestens Java 8. Entwickler können es aber freilich zum Testen von Anwendungen verwenden, die für ältere JDKs kompiliert sind. (rme)