問題の概要
Spring Cloudプロジェクトで@SpringBootTestアノテーションを使用して単体テストを実行すると、以下のエラーが発生することがあります。
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
原因の分析
@SpringBootTestアノテーションは、テスト対象のクラスのパッケージとその親パッケージをスキャンし、@SpringBootApplicationアノテーションが付与されたメインクラスを探します。このエラーが発生する主な原因は以下の通りです。
- テストクラスとメインクラスが異なるパッケージにある。
- プロジェクトまたはモジュールにメインクラスが存在しない(例:テスト専用の独立モジュール)。
@SpringBootTestのclasses属性が正しく設定されていない。
解決策
1. テストクラスをメインクラスと同じパッケージまたはそのサブパッケージに配置する
標準的なプロジェクト構造の例です。テストクラスはメインクラスと同じパッケージに配置することで、自動的にスキャンされます。
src/
main/
java/
com/example/app/
MainApp.java # メインクラス(@SpringBootApplication)
test/
java/
com/example/app/ # テストクラスはここに配置
MyTest.java # テストクラス
2. メインクラスを明示的に指定する
テストクラスをメインクラスのパッケージ構造に合わせることができない場合、@SpringBootTestアノテーション内でメインクラスを直接指定します。
@SpringBootTest(classes = MainApp.class) // メインクラスを指定
public class MyTest {
// テストコード
}
3. テスト用のモックメインクラスを作成する(メインクラスがない場合)
メインクラスがない独立したモジュールをテストする場合、テスト専用の設定クラスを作成できます。
@SpringBootApplication
public class MockMainApp { // テスト用のモッククラス
}
@SpringBootTest(classes = MockMainApp.class)
public class MyConfigTest {
// テストコード
}
4. @SpringBootTestアノテーションを削除する
完全なSpringコンテキストをロードする必要がない、単純なコードテストの場合、@SpringBootTestアノテーションを削除し、@Testアノテーションのみを使用できます。
import org.junit.jupiter.api.Test;
public class SimpleTest {
@Test
void sampleTest() {
System.out.println("テスト成功");
}
}