[SpringBoot] ユニットテスト時にapplication.ymlの値を部分的に上書きする

仕事でSpringBootをよく使ってて、設定値をapplication.ymlから読み込んでいます。

この設定値の一部のみをユニットテストのときのみ変えたいことがちょくちょくあるのですが、方法をいつも忘れるのでその方法のメモです。

特定のユニットテストのみで設定値を変える方法と、ユニットテスト全体で設定値を変える方法の2つを紹介します。

やりたいこと

↓のような設定値を書いたapplication.ymlがあります。

setting:
  value1: hoge # ← ユニットテストのときのみこの値を変更したい
  value2: fuga # ← この値は変更したくない

これらの設定値を読み込んだ下記クラスもあります。

import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SettingProperties {
    @Getter
    @Value("${setting.value1}")
    private String value1;

    @Getter
    @Value("${setting.value2}")
    private String value2;
}

↓のようなユニットテストを作成して、このユニットテスト内ではvalue1の値を変えたいです。

@SpringBootTest
class DemoApplicationTests {
	@Autowired
	SettingProperties properties;

	@Test
	void test() {
		Assertions.assertEquals("piyo", properties.getValue1()); // ← これが通るようにしたい
		Assertions.assertEquals("fuga", properties.getValue2());
	}
}

特定のユニットテストのみで設定値を上書きする方法

特定のユニットテストのときの設定値の一部を上書きするには、@ActiveProfilesというアノテーションを利用します。

まず、src/test/resources/application-test.ymlというファイルを作成して、上書きしたい設定値の値のみを記載します。

setting:
  value1: piyo

次に、上書きした値を利用したいユニットテストで、@ActiveProfilesアノテーションを追加します。アノテーションの引数にはapplication-<任意の値>.ymlで指定した<任意の値>部分の文字列を指定します。(今回の場合はtest

@SpringBootTest
@ActiveProfiles("test") // ← この行を追加
class DemoApplicationTests {
	@Autowired
	SettingProperties properties;

	@Test
	void test() {
		Assertions.assertEquals("piyo", properties.getValue1());
		Assertions.assertEquals("fuga", properties.getValue2());
	}
}

すると、このユニットテストは問題なく通るようになります。

参考:

テスト用の設定を分ける – @ActiveProfiles
今回は、テスト時にDBを変更したい場合に流用なActiveProfilesアノテーションについてみていきたいと…

ユニットテスト全体で設定値を上書きする方法

上述のように@ActiveProfilesを利用すればユニットテストのときのみ特定の設定値を上書きすることができます。
しかし、ユニットテスト全体で特定の設定値を上書きした場合、ユニットテストの数が多いと全てに@ActiveProfilesを記載するのは少々大変です。

そこで、ユニットテスト全体で特定の設定値を上書きする方法も紹介します。

まず、src/test/resources/config/application.ymlというファイルを作成して、上書きしたい設定値の値のみを記載します。

setting:
  value1: piyo

configという名前のディレクトリ直下にapplication.ymlを配置するのがポイントです。

必要な修正はこれだけです。これだけで、ユニットテスト内ではSettingProperties::getValue1()を呼び出すとpiyoという文字列が返ってくるようになります。

SpringBootではベースとなるapplication.ymlを読み込んだ後に、configディレクトリ内にapplication.ymlがあればそれを追加で読み込むため、このような挙動になります。

そのため、src/test/resources/config/application.ymlにユニットテスト用に上書きしたい設定を書けば、テスト全体でその値が利用されるようになります。

参考:

Externalized Configuration :: Spring Boot

コメント