Spring Boot でプロファイルに応じて読み込む設定ファイルの設定値をテストする
参考
- Testing Spring Boot @ConfigurationProperties | Baeldung
- 【2021】SpringBootでpropertiesやymlの設定ファイルが読み込めることのテストを書く - きり丸の技術日記
本文
公式リファレンスドキュメント に記載されているように、 Spring Boot での外部設定ファイル読み込み方法は色々ある。
application.(yml|properties)
と、 Profile 毎に application-production.(yml|properties)
などを配置して プロファイル固有の設定を記述 するのを基本として、
spring.config.import
で追加の設定ファイルを読み込んだり、
YAML のマルチドキュメント と spring.config.activate.on-profile
などを使って 特定の条件で Property を有効化 したり、
Profile Groups でプロファイルをグループ化したり、等々。
色々なやり方がある故に、例えば本番環境用など特定のプロファイルでベースの設定をオーバーライドしたい、というような場合に、ちょっと手の込んだ記述をしていたりすると、本当に意図した通りに値が設定されているか不安になることがある。
実際にそのプロファイルで動かしてみるまで分からないのでは困るので、 test で確認出来るようにしてみる。
実際のテストコードはこちら( ProductionConfigTest.kt )。 Kotest での記述になっているが、 Kotest 固有の部分は無い。
全容は以下の通り。
@ContextConfiguration(initializers = [ConfigDataApplicationContextInitializer::class])
@ActiveProfiles("production")
class ProductionConfigTest(env: ConfigurableEnvironment) : FunSpec({
test("R2DBC設定") {
env.getProperty("spring.r2dbc.url") shouldContain "prod.yewton.net:5432"
}
test("Redis設定") {
env.getProperty("spring.data.redis.host") shouldContain "prod.yewton.net"
}
})
@ContextConfiguration(initializers = [ConfigDataApplicationContextInitializer::class])
@ContextConfiguration
に org.springframework.boot.test.context.ConfigDataApplicationContextInitializer
を指定することで、 application.properties
等の設定ファイルをロードするよう指定出来るのは、冒頭の参考リンクにある通り。
@ActiveProfiles("production")
@ActiveProfiles でテストしたいプロファイルを指定する。
class ProductionConfigTest(env: ConfigurableEnvironment) : FunSpec({
設定値は ConfigurableEnvironment
を autowire して取得する。
ConfigurableEnvironment
は、 内部的に複数の PropertySource
を保持しており、これらを使ってプロパティの値を解決する。
試しにデバッガで見てみると、読み込まれているファイル群を確認出来る:
ちなみに各 PropertySource#source
に、 Map
として設定値が格納されている:
これを利用して、設定キーの一覧を作成したりすることも可能。
env.getProperty("spring.r2dbc.url") shouldContain "prod.yewton.net:5432"
PropertyResolver#getProperty
メソッドで、特定のプロパティの値を取得出来る。
この値を利用してどういったテストを書くかは、状況に応じて。