JUnit5による@RegisterExtensionによるプログラムによる拡張登録

@RegisterExtensionを使用したJUnit5のプログラムによる拡張登録

1. 概要

JUnit 5は、拡張機能を登録するための複数のメソッドを提供します。 これらの方法のいくつかの概要については、Guide to JUnit 5 Extensionsを参照してください。

このクイックチュートリアルでは、@RegisterExtensionアノテーションを使用したJUnit5拡張機能のプログラムによる登録に焦点を当てます。

2. @RegisterExtension

この注釈をテストクラスのフィールドに適用できます。 One advantage of this method is that we can access the extension as an object in the test content directly. 

JUnitは適切な段階で拡張メソッドを呼び出します。

たとえば、拡張機能がBeforeEachCallback,を実装している場合、JUnitはテストメソッドを実行する前に対応するインターフェイスメソッドを呼び出します。

3. 静的フィールドでの@RegisterExtensionの使用

静的フィールドで使用する場合、JUnitは、クラスレベルの@ExtendWithベースの拡張機能が適用された後に、この拡張機能のメソッドを適用します。

また、JUnitは拡張機能のクラスレベルとメソッドレベルの両方のコールバックを呼び出します。

たとえば、次の拡張機能は、beforeAllbeforeEachの両方の実装を特徴としています。

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

この拡張機能をテストの静的フィールドに適用してみましょう。

public class RegisterExtensionTest {

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

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

出力には、beforeAllメソッドとbeforeEachメソッドの両方からのメッセージが表示されます。

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

4. インスタンスフィールドでの@RegisterExtensionの使用

非静的フィールドでRegisterExtensionを使用する場合、JUnitはすべてのTestInstancePostProcessorコールバックを処理した後にのみ拡張機能を適用します。

この場合、JUnitはbeforeAllのようなクラスレベルのコールバックを無視します。

上記の例では、LoggingExtensionからstatic修飾子を削除しましょう。

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

これで、出力に示されているように、JUnitはbeforeEachメソッドのみを呼び出します。

Type instance version In beforeEach : demoTest()

5. 結論

この記事では、JUnit 5拡張機能を@RegisterExtensionにプログラムで登録する方法の概要を説明しました。

また、静的フィールドに拡張機能を適用する場合と適用しない場合の違いについても説明しました。 インスタンスフィールド。

いつものように、コード例はGithub repositoryにあります。