2017-03-09 181 views
9

我正在使用Spring Boot 1.5.1構建非常基本的Web應用程序,並希望創建用於檢查REST端點的集成測試。根據文檔建議,可以使用MockMvc。Spring Boot集成測試:@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相關的測試用例被刪除,那麼所有三個類成功共享共享相同的上下文

所以問題是如何獲得共享上下文的所有測試與MockMvc

注意:其他資源建議使用MockMvcBuilders.webAppContextSetup(context).build()獲取MockMvc實例,但它不適用於我(它不涉及處理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在我的項目運行良好。
你是什麼意思,「它不涉及處理Web請求時的過濾器」?

+0

我正在運行集成測試,在那裏檢查Web層如何與服務一起工作。我的一些功能依賴於Web請求過濾器,這些過濾器依次提取標題參數並將它們傳遞給服務。所以爲了讓Web +服務集成,我也需要過濾器。 – Vitaljok

相關問題