JUnit5 Programmatic Extension-Registrierung mit @RegisterExtension

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.