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要求を処理する際にフィルタは含まれません)。
私は全く同じ問題を抱えています。私が見つけた唯一の回避策は 'mockMvc'を使わず、' TestRestTemplate'を使うことです。これは間違いなく良い解決策ではありません。 –
この回答は役に立ちます。 https://stackoverflow.com/a/41051585/1849366https://stackoverflow.com/a/41051585/1849366 –
基本クラスでmockmvcを設定し、各テストスイートでそのクラスを拡張しようとしましたか?また、コンテキストを共有するためのテストがなぜ必要なのか不思議です。「私は[この設定]が好きです(https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot -1-4)はspring.ioのブログでカバーされています。各コントローラを個別にテストする。 –