SpringBootTest向けにConfigurationを設定する
SpringBoot3系で @SpringBootTest を使ったテストに対して、テスト用のConfigurationを設定してDIされるオブジェクトを挿げ替えたいことが度々あるがよく混乱するのでメモ
単純にConfigをtestフォルダ配下に設定
パッケージ構造など
main
com.example.demo
DemoApplication.java: @SpringBootApplicationついてる起動クラス
test
com.example.demo.config
TestConfig.java: @Configureで
com.example.demo
DemoTest.java: @SpringBootTestでテストを実行する
@SpringBootApplicationには、@ComponentScanが含まれているので、com.example.demo 配下をコンポーネントスキャンしにいく
そのためDemoTestのテスト実行時TestConfigも読み込まれることになる
DemoTestの内部クラスとしてTestConfigを定義する場合は、@SpringBootTest or @ContextConfigurationのclassesにConfigクラスを指定してやる必要がある
多分ネストしてる場合は@ComponentScanで読みこまれてない
この辺は@SpringBootApplicationについてる@ContextConfigurationの設定を読むと裏取れそう
このとき、DemoApplicationクラスも一緒に指定しないと、TestConfigだけ設定されてTestが実行される
@SpringBootTest(classes = {DemoApplication.class, TemoTest.TestConfig.class})
Spring Boot アプリケーションをテストする場合、これは多くの場合必要ありません。Spring Boot の @*Test アノテーションは、明示的に定義しない限り、プライマリ設定を自動的に検索します。
@TestConfiguration
@Configurationをスコープを狭めてDemoTest内の内部クラスとしてConfigurationを定義する場合、@TestConfigurationで定義してやるとclassesへの指定などが不要そう
プライマリ設定をカスタマイズする場合は、ネストされた @TestConfiguration クラスを使用できます。アプリケーションのプライマリ設定の代わりに使用されるネストされた @Configuration クラスとは異なり、ネストされた @TestConfiguration クラスはアプリケーションのプライマリ設定に加えて使用されます。
テスト用に追加の Bean またはカスタマイズを定義するために使用できる @Configuration。通常の @Configuration クラスとは異なり、@TestConfiguration の使用は @SpringBootConfiguration の自動検出を妨げません。
@TestConfiguration使うと、@SpringBootApplicationに加えて、TestConfigも設定するよという感じになるので良さげ