見出し画像

【SpringBoot 1.5.x】@TestPropertySource でYAMLファイルが読めなくてハマった話

どうやらパターンがあったので、備忘録としてまとめを。
たぶん、2系にあげるときに、ここ対応したこと忘れそうなので。。

①テストでDBは使ってないんだけど、起動時に読み込んじゃうので黙殺したいケース

特に変わったConfigとか使わないからmainと同じConfigで良いけど、DBは使わないケースなんかが当てはまるかと。
やることは2つ

1-1. テストケースに @ActiveProfile("test") を追加する

『test』じゃなくても、このあとにYAMLに記述する『profiles.active』の値と合ってればいいです。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { TestApplication.class })  // ここでApplicationクラス呼んでなければこんなことしなくても良いかも。
@TestPropertySource(locations = "/application-test.yml")
@ActiveProfiles("test")
public class HogeHogeIntegrationTest {

1-2. application-test.yml に『profiles.active』を記述する

spring:
 profiles.active: test

参考:Spring Boot - テスト時に読み込むDBを変更する - Testによって更に設定を分岐させる

②@ContextConfiguration を使って読み込んでる場合

Controllerとかのテストが該当するかも。
以下のstackoverflowの回答を追加すれば出来る環境もあると思いますが、弊環境は①のパターンと組み合わせだった。

2-1. テストクラスにアノテーション諸々を追加する

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@TestPropertySource(locations = "/application-test.yml")
@ContextConfiguration(classes = { TestApplication.class, TestDataSourceConfig.class,
		SecurityConfig.class }, initializers = ConfigFileApplicationContextInitializer.class)
@ActiveProfiles("test")

initializers = ConfigFileApplicationContextInitializer.class がポイント。

2-2. application-test.yml に『profiles.active』を記述する

これは1-2と同じなので割愛


たぶん。src/test/resources の下に置くのがapplication.yml だった場合、こんな設定とかいらないかもしれないけど、同名ファイルがあるってVSCodeは怒るし、やってる方もいつか間違えそうなので、ファイル名は分けたい派です。


では快適なSpringbootライフを。そろそろ2系にあげたい。

この記事が気に入ったらサポートをしてみませんか?