以下のコントローラーをテストしています
@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の構成を要求する理由がわかりません。ここで何が起こっているのか、正しい方向を教えてください。また、これを修正する方法。ありがとう
だからここに解決策があります:
テスト構成の検出に関するドキュメント の意味:
検索アルゴリズムは、@ 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の混乱が解消されることを願っています。ありがとう
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テスト済み
同じエラーが発生し、プロジェクトを生成したときに、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にどのようになったのかはわかりませんが、私の場合、修正はそれほど簡単ではありませんでした。
これが誰かの助けになることを願っています。