Spring Boot 1.5.1を使用して非常に基本的なWebアプリケーションを構築しており、RESTエンドポイントをチェックするための統合テストを作成したいと考えていました。ドキュメントで推奨されているように、MockMvcを使用する場合があります。
非常に単純なテストクラスは次のとおりです。
_package foo.bar.first;
import ...
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApplicationTest1 {
@Autowired
private WebApplicationContext context;
@Autowired
private MockMvc mvc;
@Test
public void shouldStartWebApplicationContext() {
assertThat(context).isNotNull();
}
@Test
public void shouldReplyToPing() throws Exception {
mvc.perform(get("/ping"))
.andExpect(status().isOk());
}
}
_
予想どおり、完全なアプリケーションコンテキストを開始し、テストを実行します。
後で私は他の同様のテストクラスを作成し、ブランド新しいアプリケーションコンテキストが各テストクラスに対して起動されていることに気付きました。実験によると、コンテキストは同じパッケージのテストクラス間でのみ共有されます。
たとえば、同じテストクラスが複数回コピーされた場合、コンテキストは次のようになります。
_foo.bar
first
ApplicationTest1 (shared context)
ApplicationTest2 (shared context)
second
ApplicationTest3 (brand new context)
_
また、さらなる調査により、それが_@AutoConfigureMockMvc
_アノテーションに関連していることが示されました。アノテーションとMockMvc関連のテストケースが削除された場合、3つのクラスすべてが正常に同じコンテキストを共有。
したがって、問題は、MockMvcを使用したすべてのテストの共有コンテキストを取得する方法です。
注:他のリソースでは、MockMvcインスタンスを取得するためにMockMvcBuilders.webAppContextSetup(context).build()
を使用することを提案していますが、私には機能しません(Web要求を処理するときにフィルターは含まれません)。
Spring Boot 1.5で導入されたバグのようです: https://github.com/spring-projects/spring-boot/issues/9282
Spring Boot 1.4.xへのダウングレードを試すか、修正バージョン(次のリリース1.5.5に向けて計画されている)を待つことができます。
更新:「@ AutoConfigureMockMvc」の代わりに、MockMVCを手動で構成することもできます: https://docs.spring.io/spring- security/site/docs/4.2.x/reference/html/test-mockmvc.html
MockMVCを手動で構成すると、プロジェクトで正常に機能しました。
「Webリクエストを処理するときにフィルターが含まれない」とはどういう意味ですか?