きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

SpringのTestExecutionListenerのTestContextから設定ファイルの値を読み込む

小ネタ。

環境

  • Java
    • 16
  • SpringBoot
    • 2.4.5

概要

設定ファイルの値を取得したい場合は、TestContextからApplicationContextEnvironmentを経由してgetProperty(String key)で取得できます。

testContext
  .getApplicationContext()
  .getEnvironment()
  .getProperty("spring.datasource.driver-class-name")

ゴール

SpringのTestExecutionListenerのパラメータのTestContextから設定ファイルの値を読み込みます。

ユースケース

今回の記事では、SpringのJDBCドライバのクラス名がoracle.jdbc.OracleDriverである時だけ、テストメソッドを実行するアノテーションを作成します。設定するプロパティ名はspring.datasource.driver-class-nameとします。

特定の条件を満たしたときだけテストを実行する、アノテーションを作成する等は次の記事を参考にしてください。

対応

アノテーションを作成する

アノテーションを作成します。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface OracleOnly {
}

テストのリスナを作成する

アノテーションに挙動を付与します。

詳しいことは以前の記事を参考にしてください。

設定ファイルの値を取得したい場合は、TestContextからApplicationContextEnvironmentを経由してgetProperty(String key)で取得できます。

今回はユースケースを満たせるように、プロパティのspring.datasource.driver-class-nameoracle.jdb.OracleDriver以外の場合は実行しないようにします。

public class OracleOnlyTestExecutionListener implements TestExecutionListener {
  @Override
  public void beforeTestMethod(TestContext testContext) {
    // テストメソッドのアノテーションを読み込む
    var annotation = AnnotationUtils.findAnnotation(testContext.getTestMethod(), OracleOnly.class);
    if (annotation == null) {
      return ;
    }

    String property = testContext.getApplicationContext().getEnvironment()
        .getProperty("spring.datasource.driver-class-name");
    
    if (!"oracle.jdbc.OracleDriver".equals(property)){
      assumeTrue(false);
    }
  }
}

アノテーションのリスナを単体テストする

Nestedしてもうまく動かないので、JDBCドライバをOracleに設定しているテストクラスと、PostgreSQLに設定しているクラスの2クラス作成します。どちらもTestExecutionListenersにて作成したリスナを読み込ませてください。また、SpringBootTestpropertiesでプロパティを設定します。

OracleをJDBCドライバに設定しているテストクラス

問題がなければテストが実行されます。

@TestExecutionListeners(OracleOnlyTestExecutionListener.class)
@SpringBootTest(properties = {
    "spring.datasource.driver-class-name:oracle.jdbc.OracleDriver",})
public class OracleOnlyTestExecutionListenerOracleTests {

  @OracleOnly
  @Test
  void test_02() {
    assertTrue(true, "実行すること");
  }
}

PostgreSQLをJDBCドライバに設定しているテストクラス

JDBCドライバがPostgreSQLのため、実行しません。実行した場合、アノテーションの期待していない挙動とみなすためにAssert.fail()を実行しています。

@TestExecutionListeners(OracleOnlyTestExecutionListener.class)
@SpringBootTest(properties = {
    "spring.datasource.driver-class-name:org.postgresql.Driver",})
public class OracleOnlyTestExecutionListenerPostgresTests {

  @OracleOnly
  @Test
  void test_01() {
    fail();
  }
}

ソースコード

※実際にspring.datasource.driver-class-nameを設定するとJDBCドライバが必要となるため、サンプルコードではspring.dummy-datasource.driver-class-nameとしています。

終わりに

この記事は、概要がすべてです。他の内容は全部蛇足。でも、ユースケースを伝えたほうが伝わると思いますので、こちらの書き方をしています。


この記事お役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

類似

f:id:nainaistar:20210811081531p:plain