Spring Bootテストにおける「java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration」の解決策

問題の概要

Spring Cloudプロジェクトで@SpringBootTestアノテーションを使用して単体テストを実行すると、以下のエラーが発生することがあります。

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

原因の分析

@SpringBootTestアノテーションは、テスト対象のクラスのパッケージとその親パッケージをスキャンし、@SpringBootApplicationアノテーションが付与されたメインクラスを探します。このエラーが発生する主な原因は以下の通りです。

  1. テストクラスとメインクラスが異なるパッケージにある。
  2. プロジェクトまたはモジュールにメインクラスが存在しない(例:テスト専用の独立モジュール)。
  3. @SpringBootTestclasses属性が正しく設定されていない。

解決策

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("テスト成功");
    }
}

タグ: Spring Boot JUnit テスト Spring Cloud

6月21日 22:02 投稿