web-dev-qa-db-ja.com

Spring Boot統合テスト:@AutoConfigureMockMvcとコンテキストキャッシング

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要求を処理するときにフィルターは含まれません)。

12
Vitaljok

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リクエストを処理するときにフィルターが含まれない」とはどういう意味ですか?

3
brabenetz