2017-03-09 12 views
9

Springブート1.5.1を使用して非常に基本的なWebアプリケーションを構築しており、RESTエンドポイントを確認するための統合テストを作成したいと考えていました。 ドキュメントで推薦されているように、MockMvcを使用することができます。Springブート統合テスト:@AutoConfigureMockMvcとコンテキストキャッシング

予想通り
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要求を処理する際にフィルタは含まれません)。

+0

私は全く同じ問題を抱えています。私が見つけた唯一の回避策は 'mockMvc'を使わず、' TestRestTemplate'を使うことです。これは間違いなく良い解決策ではありません。 –

+0

この回答は役に立ちます。 https://stackoverflow.com/a/41051585/1849366https://stackoverflow.com/a/41051585/1849366 –

+1

基本クラスでmockmvcを設定し、各テストスイートでそのクラスを拡張しようとしましたか?また、コンテキストを共有するためのテストがなぜ必要なのか不思議です。「私は[この設定]が好きです(https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot -1-4)はspring.ioのブログでカバーされています。各コントローラを個別にテストする。 –

答えて

2

春ブーツ1.5で導入されたバグのようです: https://github.com/spring-projects/spring-boot/issues/9282

あなたは春のブート1.4.xのにダウングレードしてみたり(次のリリース1.5.5のため予定)固定バージョンを待つことができます。

更新: 代わりに "@AutoConfigureMockMvc" のことができます。また、手動で構成しますMockMVCの: https://docs.spring.io/spring-security/site/docs/current/reference/html/test-mockmvc.html

マニュアルMockMVCが私のプロジェクトにうまく働いて構成します。
「ウェブリクエストを処理するときにフィルタを使用しない」とはどういう意味ですか?

+0

私は統合テストを実行していました。そこでは、Web層がどのようにサービスと連携して動作するかを確認します。私の機能の中には、Webリクエストフィルタに依存するものがあります。これらのフィルタは、ヘッダパラメータを抽出してサービスに渡します。したがって、Web +サービスの統合を行うには、フィルタも必要です。 – Vitaljok

関連する問題