きり丸の日記

通信事業会社のエンジニアです。インフラはよくわかりません。アプリケーションエンジニアです。Javaを使うエンジニアです。QAやテストでの第一人者になりたい。

【Spring】SpringBootでpropertiesやymlの設定ファイルが読み込めることのテストを書く【Java】

SpringBootではpropertiesファイルやymlファイル(以降、設定ファイル)に、DBのURL等々の環境ごとの変数を記載できます。

設定ファイルの値が目的通り一致していることを書くテストには大きい価値は無いので、全設定ファイルのテストを作成する必要はありません。ただし、設定ファイルが目的通りに読み込めていることを示すテストは、最低1つはあるべきだと考えています。

今回の記事は、設定ファイルを読み込んでいることを示すテストを記載します。

ゴール

設定ファイルを読み込めていることを示すテストを書けるようにする。

ソースコード

設定ファイル


下記のディレクトリに、設定ファイルを記載する 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ソースコード

  • 対象ファイル
    • application.yml(activeProfilesにutを指定)
    • application-ut.yml(profiles=utで動かしているので、設定値はこちら)
    • CoreProperties.java
    • CorePropertiesTests.java

github.com

公式ヘルプ&公式ソース

www.baeldung.com

github.com

終わりに

仕事でも同じソースを書きましたが、複数のアノテーションを使った記憶が無かったので混乱しました。誰かが高速化のためにリファクタリングしてくれたのか、自分が単純に忘れているのかわかりませんが、改めて勉強になりました。

本当は設定ファイルのアンカーやエイリアスを使ったうえで、共通化できることの検証をしたかったのですが、その手前で時間をかけてしまいました。やっぱり、TDDの最初のステップは難易度が高いですね。この辺を自分の知識をフル動員したり、ブログに残したりして次回失敗する時間を1分でも短縮したいと考えています。

この辺をサクっとできて品質担保する時間を確保できれば、他の人にも一目置かれる存在になると考えているので勉強していきたいです。


もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、Twitterのフォローもよろしくお願いします。

私の励みになります。

f:id:nainaistar:20201013111905p:plain