2021/03/31 追記
SpringBoot2.4以降の場合はこちらの記事も参考にしてみてください。
SpringBootではpropertiesファイルやymlファイル(以降、設定ファイル)に、DBのURL等々の環境ごとの変数を記載できます。
設定ファイルの値が目的通り一致していることを書くテストには大きい価値は無いので、全設定ファイルのテストを作成する必要はありません。ただし、設定ファイルが目的通りに読み込めていることを示すテストは、最低1つはあるべきだと考えています。
今回の記事は、設定ファイルを読み込んでいることを示すテストを記載します。
ゴール
設定ファイルを読み込めていることを示すテストを書けるようにする。
環境
- org.springframework.boot
- 2.2.0.M3
ソースコード
設定ファイル
下記のディレクトリに、設定ファイルを記載する
src/test/resources/application.yml
app: config: appName: "Kirimaru"
設定ファイルを読み込むJavaファイル
ConfigurationPropertiesアノテーションを使用する。prefixをつけることで、特定の階層以降を読み込むことができるので、可読性が上がる。
下記ディレクトリにJavaファイルを格納する。
{ContextRoot}/config/CoreProperties.java
import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; @Getter @Setter @ConfigurationProperties(prefix = "app.config") public class CoreProperties { private String appName; }
テストコード
SpringJunitConfig
アノテーションと、EnableConfigurationProperties
アノテーションを使用します。
設定ファイルから読み込ませて、目的通り読み込んでいることを確認する必要があるので、SpringJunitConfig
のイニシャライザにConfigFileApplicationCOntextInitializer.class
を指定する必要があります。
また、必要な設定ファイルを読み込ませるために、EnableConfigurationProperties
に読み込ませたい設定ファイルを指定します。今回の例ではCoreProperties.class
です。
{TestのContextRoot}/config/CorePropertiesTests.java
@SpringJUnitConfig(initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties({CoreProperties.class}) class CorePropertiesTests { @Autowired CoreProperties coreProperties; @Test void test_01(){ assertThat(coreProperties.getAppName()).isEqualTo("Kirimaru"); } }
GitHubのソースコード
- 対象ファイル
公式ヘルプ&公式ソース
終わりに
仕事でも同じソースを書きましたが、複数のアノテーションを使った記憶が無かったので混乱しました。誰かが高速化のためにリファクタリングしてくれたのか、自分が単純に忘れているのかわかりませんが、改めて勉強になりました。
本当は設定ファイルのアンカーやエイリアスを使ったうえで、共通化できることの検証をしたかったのですが、その手前で時間をかけてしまいました。やっぱり、TDDの最初のステップは難易度が高いですね。この辺を自分の知識をフル動員したり、ブログに残したりして次回失敗する時間を1分でも短縮したいと考えています。
この辺をサクっとできて品質担保する時間を確保できれば、他の人にも一目置かれる存在になると考えているので勉強していきたいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。