Spring Boot でプロファイルに応じて読み込む設定ファイルの設定値をテストする

参考

本文

公式リファレンスドキュメント に記載されているように、 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])

@ContextConfigurationorg.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 メソッドで、特定のプロパティの値を取得出来る。

この値を利用してどういったテストを書くかは、状況に応じて。

yewton
yewton
ソフトウェアエンジニア

父親兼エンジニア

comments powered by Disqus
次へ
前へ