小ネタ。
環境
- Java
- 16
- SpringBoot
- 2.4.5
概要
設定ファイルの値を取得したい場合は、TestContext
からApplicationContext
、Environment
を経由して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
とします。
特定の条件を満たしたときだけテストを実行する、アノテーションを作成する等は次の記事を参考にしてください。
- Javaで事前条件を満たしていないテストを安全に終了させる(AssumeTrue) - きり丸の技術日記
- 【Spring】TestExecutionListnerを継承した自作アノテーションでSpringのテストセットアップを快適にする - きり丸の技術日記
対応
アノテーションを作成する
アノテーションを作成します。
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface OracleOnly { }
テストのリスナを作成する
アノテーションに挙動を付与します。
詳しいことは以前の記事を参考にしてください。
設定ファイルの値を取得したい場合は、TestContext
からApplicationContext
、Environment
を経由してgetProperty(String key)
で取得できます。
今回はユースケースを満たせるように、プロパティのspring.datasource.driver-class-name
がoracle.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
にて作成したリスナを読み込ませてください。また、SpringBootTest
のproperties
でプロパティを設定します。
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でのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
類似
- Javaで事前条件を満たしていないテストを安全に終了させる(AssumeTrue) - きり丸の技術日記
- 【Spring】TestExecutionListnerを継承した自作アノテーションでSpringのテストセットアップを快適にする - きり丸の技術日記