JUnit5 Programmatic Extension Registration mit @RegisterExtension
1. Überblick
JUnit 5 bietet mehrere Methoden zum Registrieren von Erweiterungen. Eine Übersicht über einige dieser Methoden finden Sie in unserenGuide to JUnit 5 Extensions.
In diesem kurzen Tutorial konzentrieren wir uns auf die programmgesteuerte Registrierung von JUnit 5-Erweiterungen unter Verwendung der Annotation@RegisterExtension.
2. @RegisterExtension
Wir können diese Annotation auf Felder in Testklassen anwenden. One advantage of this method is that we can access the extension as an object in the test content directly.
JUnit ruft die Erweiterungsmethoden in den entsprechenden Phasen auf.
Wenn eine Erweiterung beispielsweiseBeforeEachCallback,implementiert, ruft JUnit die entsprechenden Schnittstellenmethoden auf, bevor eine Testmethode ausgeführt wird.
3. Verwenden von@RegisterExtension mit statischen Feldern
Bei Verwendung mit statischen Feldern wendet JUnit die Methoden dieser Erweiterung an, nachdem die auf@ExtendWithbasierenden Erweiterungen auf Klassenebene angewendet wurden.
Außerdem ruft JUnit sowohl Klassen- als auch Methodenrückrufe der Erweiterung auf.
Die folgende Erweiterung enthält beispielsweise die Implementierung vonbeforeAll undbeforeEach:
public class LoggingExtension implements
BeforeAllCallback, BeforeEachCallback {
// logger, constructor etc
@Override
public void beforeAll(ExtensionContext extensionContext)
throws Exception {
logger.info("Type {} In beforeAll : {}",
type, extensionContext.getDisplayName());
}
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
logger.info("Type {} In beforeEach : {}",
type, extensionContext.getDisplayName());
}
public String getType() {
return type;
}
}
Wenden wir diese Erweiterung auf ein statisches Feld eines Tests an:
public class RegisterExtensionTest {
@RegisterExtension
static LoggingExtension staticExtension = new LoggingExtension("static version");
@Test
public void demoTest() {
// assertions
}
}
Die Ausgabe zeigt Nachrichten von den MethodenbeforeAll undbeforeEach:
Type static version In beforeAll : RegisterExtensionTest
Type static version In beforeEach : demoTest()
4. Verwenden von@RegisterExtension mit Instanzfeldern
Wenn wirRegisterExtension mit nicht statischen Feldern verwenden, wendet JUnit die Erweiterung erst an, nachdem alle Rückrufe vonTestInstancePostProcessorverarbeitet wurden.
In diesem Fall ignoriert JUnit Rückrufe auf Klassenebene wiebeforeAll.
Entfernen Sie im obigen Beispiel den Modifikatorstatic ausLoggingExtension:
@RegisterExtension
LoggingExtension instanceLevelExtension = new LoggingExtension("instance version");
Jetzt wird JUnit nur diebeforeEach Methode aufrufen, wie in der Ausgabe zu sehen:
Type instance version In beforeEach : demoTest()
5. Fazit
In diesem Artikel haben wir einen Überblick über die programmgesteuerte Registrierung von JUnit 5-Erweiterungen mit@RegisterExtension gegeben.
Wir haben auch den Unterschied zwischen der Anwendung der Erweiterung auf statische Felder und Instanzfelder.
Wie üblich finden Sie Codebeispiele bei unserenGithub repository.