web-dev-qa-db-ja.com

エラー:Spring Controllerで@WebMvcTestを実行しているときに@SpringBootConfigurationが見つかりません

以下のコントローラーをテストしています

@Controller
public class MasterController {

@GetMapping("/")
public String goLoginPage(){
    return "index";
}
}

私は this Springのドキュメントに従ってコントローラーをテストしています。ここで、ドキュメントに記載されているSpringコンテキスト全体ではなく、Webレイヤーをインスタンス化するだけでコントローラーをテストします。以下は同じための私のコードです。

@RunWith(SpringRunner.class)
@WebMvcTest
public class MasterControllerTestWithWebLayer {

@Autowired
MockMvc mockMvc;

@Autowired
MasterController masterController;


@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testLoginHome() throws Exception{
    mockMvc.perform(get("/"))
    .andExpect(status().isOk())
    .andExpect(view().name("index"));
}

}

このテストを実行すると、エラーUnable to find @SpringBootConfiguration,...etcが表示されます。しかし、Springのインスタンス化を望まず、Webレイヤーのみを使用したい場合に、Springの構成を要求する理由がわかりません。ここで何が起こっているのか、正しい方向を教えてください。また、これを修正する方法。ありがとう

29
Meena Chaudhary

だからここに解決策があります:

テスト構成の検出に関するドキュメント の意味:

検索アルゴリズムは、@ SpringBootApplicationまたは@SpringBootConfiguration注釈付きクラスが見つかるまで、テストを含むパッケージから機能します。コードを適切な方法で構成している限り、通常はメイン構成が見つかります。

したがって、@SpringBootApplicationクラスは、テストクラスよりもパッケージ階層で上位にある必要があります。たとえば、テストクラスがパッケージcom.zerosolutions.controllerである場合、@SpringBootApplicationクラスはcom.zerosolutions.controllerより上位のパッケージにある必要がありますパッケージcom.zerosolutionsまたはcom

問題

しかし、@SpringBootApplicationクラスがテストクラスと同じレベルにある場合、それを見つけることができません。つまり、com.zerosolutions.generalです。この場合、次のエラーが表示されます。

Java.lang.IllegalStateException:@SpringBootConfigurationが見つかりません。テストで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります

ソリューション

統合テストを実行している場合、次のように@SpringBootApplicationクラスを明示的に言及できます。

@RunWith(SpringRunner.class)
@SpringBootTest(classes={SpringBootApp.class})

ただし、コントローラーのユニットテストを実行する場合は、Springコンテキスト全体を起動する必要はありません。代わりに@SpringBootTest@WebMvcTest(MasterController.class)に置き換えることができます。これにより、Springコンテキスト全体ではなく、MasterControllerを使用してWebレイヤーのみがインスタンス化されます。

問題

しかし問題は、以前に直面したエラーに再び遭遇することです。

Java.lang.IllegalStateException:@SpringBootConfigurationが見つかりません。テストで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります

また、@WebMvtTestには、@SpringBootTestクラスのように明示的に言及する@SpringBootApplicationのようなclasses属性がありません。そのため、これには2つの解決策があります。

ソリューション

最初の:テストクラスよりも高いパッケージ、つまりcom.zerosolutionsまたはcomパッケージにアプリケーションクラスを移動します。

Second@SpringBootApplicationクラスに以下のように明示的に言及してください

@RunWith(SpringRunner.class)
@WebMvcTest(MasterController.class)
@ContextConfiguration(classes={SpringBootApp.class})

Spring Test Configurationの混乱が解消されることを願っています。ありがとう

74
Meena Chaudhary

Application.Javaクラス(src/main/Java内)が下にある場合

com.A.B

テストクラスApplicationTest.Java(src/test/Java内)の下にある必要があります

com.A.Bまたはcom.A.B.Cまたはcom.A.B.C.D

テストクラスが次のパッケージにある場合、このエラーが発生します。

com.Aまたはcom.A.Cまたはcom.A.D

Springブートでは、一般ルールIS テストクラスパッケージ名は、Javaクラスパッケージの名前から開始する必要がありますISテスト済み

17
tadtab

同じエラーが発生し、プロジェクトを生成したときに、pom.xmlで実際のドメインではなくcom.exampleとしてgroupIdが表示されることがわかりました。
<groupId>com.example</groupId>
pom.xmlを次のように修正しました。
<groupId>com.mydomain</groupId>
次に、ファイル構造を次から変更しました。
src/test/Java/com/exampleからsrc/test/Java/com/mydomain
最後に、パッケージ宣言を更新する必要がありました
SampleProjectApplicationTest.Java
ファイルを正しいファイル構造に一致させます。それがすべて整ったら、テストはうまくいきました。

プロジェクトの残りの部分が正しいcom.exampleにどのようになったのかはわかりませんが、私の場合、修正はそれほど簡単ではありませんでした。

これが誰かの助けになることを願っています。

0
stock