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

1概要

JUnit 5は拡張機能を登録するための複数の方法を提供します。これらの方法のいくつかの概要については、リンク:/junit-5-extensions[Guide to JUnit 5 Extensions]を参照してください。

このクイックチュートリアルでは、 https://junit.org/junit5/docs/current/api/org/junit/jupiter/api/extension/RegisterExtension.htmlを使用して、JUnit 5拡張機能のプログラムによる登録に焦点を当てます。 RegisterExtension] アノテーション。

2 @ RegisterExtension

このアノテーションをテストクラスのフィールドに適用することができます。 この方法の利点の1つは、テストコンテンツ内のオブジェクトとしてエクステンションに直接アクセスできることです。

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

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

3静的フィールドで @ RegisterExtension を使用する

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

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

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

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 に登録する方法の概要を説明しました。

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

いつものように、コード例はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[Githubレポジトリ]にあります。