仕事で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
を利用すればユニットテストのときのみ特定の設定値を上書きすることができます。
しかし、ユニットテスト全体で特定の設定値を上書きした場合、ユニットテストの数が多いと全てに@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
にユニットテスト用に上書きしたい設定を書けば、テスト全体でその値が利用されるようになります。
参考:
コメント