Enregistrement d’extension de programme JUnit5 avec @RegisterExtension

Enregistrement d'extension de programme JUnit5 avec @RegisterExtension

1. Vue d'ensemble

JUnit 5 fournit plusieurs méthodes pour enregistrer des extensions. Pour un aperçu de certaines de ces méthodes, reportez-vous à nosGuide to JUnit 5 Extensions.

Dans ce rapide didacticiel, nous allons nous concentrer sur l'enregistrement programmatique des extensions JUnit 5, à l'aide de l'annotation@RegisterExtension.

2. @RegisterExtension

Nous pouvons appliquer cette annotation aux champs des classes de test. One advantage of this method is that we can access the extension as an object in the test content directly. 

JUnit appellera les méthodes d’extension aux étapes appropriées.

Par exemple, si une extension implémenteBeforeEachCallback, JUnit appellera ses méthodes d'interface correspondantes avant d'exécuter une méthode de test.

3. Utilisation de@RegisterExtension avec des champs statiques

Lorsqu'il est utilisé avec des champs statiques, JUnit appliquera les méthodes de cette extension après que les extensions basées sur@ExtendWithau niveau de la classe ont été appliquées.

En outre, JUnit invoquera les rappels au niveau de la classe et de la méthode de l'extension.

Par exemple, l'extension suivante présente à la fois une implémentationbeforeAll etbeforeEach:

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;
    }
}

Appliquons cette extension à un champ statique d'un test:

public class RegisterExtensionTest {

    @RegisterExtension
    static LoggingExtension staticExtension = new LoggingExtension("static version");

    @Test
    public void demoTest() {
        // assertions
    }
}

La sortie affiche les messages des méthodesbeforeAll etbeforeEach:

Type static version In beforeAll : RegisterExtensionTest
Type static version In beforeEach : demoTest()

4. Utilisation de@RegisterExtension avec des champs d'instance

Si nous utilisonsRegisterExtension avec des champs non statiques, JUnit n'appliquera l'extension qu'après avoir traité tous les callbacks deTestInstancePostProcessor.

Dans ce cas, JUnit ignorera les rappels de niveau classe commebeforeAll.

Dans l'exemple ci-dessus, supprimons le modificateurstatic deLoggingExtension:

@RegisterExtension
LoggingExtension instanceLevelExtension = new LoggingExtension("instance version");

Maintenant, JUnit n'appellera que la méthodebeforeEach, comme indiqué dans la sortie:

Type instance version In beforeEach : demoTest()

5. Conclusion

Dans cet article, nous avons présenté un aperçu de l'enregistrement par programmation d'extensions JUnit 5 avec@RegisterExtension.

Nous avons également couvert la différence entre appliquer l’extension aux champs statiques et champs d'instance.

Comme d'habitude, des exemples de code peuvent être trouvés dans nosGithub repository.