2016-12-14 70 views
4

我想使用MockMvc在Spring Boot應用程序中測試登錄過程。成功登錄後,用戶將被重定向到/ home。爲了測試這個,我使用:使用MockMvc測試重定向URL的HTTP狀態代碼

@Test 
public void testLogin() throws Exception { 
    RequestBuilder requestBuilder = formLogin().user("[email protected]").password("test"); 
    mockMvc.perform(requestBuilder).andExpect(redirectedUrl("/home")).andExpect(status().isFound()); 
} 

這個測試提供了預期的結果。

另外,我必須測試重定向頁面(/ home)的HTTP狀態碼。假設/ home-page返回一個HTTP 500內部服務器錯誤,我需要能夠測試這個。

我試過如下:

@Test 
public void testLogin() throws Exception { 
    RequestBuilder requestBuilder = formLogin().user("[email protected]").password("test"); 
    mockMvc.perform(requestBuilder).andExpect(redirectedUrl("/home")).andExpect(status().isFound()); 
    mockMvc.perform(get("/home").with(csrf())).andExpect(status().isOk()); 
} 

相反,如果得到一個200或500(在發生錯誤的情況下),我得到的狀態碼302

有什麼方法來正確測試遵循重定向URL時的HTTP狀態代碼?

感謝和問候

回答

3

首先,我將你的測試分成2周獨立的測試,因爲你正在測試2種完全不同的情景:

@Test 
public void testSuccessfulLogin() throws Exception { 
    RequestBuilder requestBuilder = formLogin().user("[email protected]").password("test"); 
    mockMvc.perform(requestBuilder).andExpect(redirectedUrl("/home")).andExpect(status().isFound()); 
} 

@Test 
public void testHomepageThrows500() throws Exception { 

    // configure a mock service in the controller to throw an exception 

    RequestBuilder requestBuilder = formLogin().user("[email protected]").password("test"); 
    mockMvc.perform(requestBuilder).andExpect(redirectedUrl("/home")).andExpect(status().is5xxServerError()); 
} 

你的第一個測試是成功的登錄場景。

第二個測試,就像你在問題中所說的那樣,主頁(假設控制器)返回一個HTTP 500.
要進入主頁,你仍然需要登錄 - 它是而不是登錄時會產生錯誤的行爲,一旦您登錄,它就是控制器本身。
爲了讓控制器返回一個HTTP 500,你將需要模擬一些錯誤。沒有看到你的控制器,我只能猜測有一些服務被注入。在你的測試中,你應該能夠提供一個模擬的,然後配置模擬引發異常。

你應該能夠注入模擬是這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebMvcTest(HomeController.class) 
public class HomeControllerIntegrationTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @MockBean 
    private YourService yourService; 

然後測試中做類似如下(我使用的的Mockito的BDD方法):

@Test 
public void testHomepageThrows500() throws Exception { 

    given(yourService.someMethod()).willThrow(new Exception("something bad happened"); 

    RequestBuilder requestBuilder = formLogin().user("[email protected]").password("test"); 
    mockMvc.perform(requestBuilder).andExpect(redirectedUrl("/home")).andExpect(status().is5xxServerError()); 
}