使用 MockMvc 测试重定向 URL 的 HTTP 状态代码

我想使用MockMvc在Spring Boot应用程序中测试登录过程。成功登录后,用户将被重定向到 /home。为了测试这一点,我使用:

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

此测试提供预期的结果。

此外,我必须测试重定向页面(/home)的HTTP状态代码。假设/主页返回HTTP 500内部服务器错误,我需要能够对此进行测试。

我尝试了以下方法:

@Test
public void testLogin() throws Exception {
    RequestBuilder requestBuilder = formLogin().user("test@tester.de").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状态代码?

谢谢和最好的问候


答案 1

首先,我将测试拆分为 2 个单独的测试,因为您正在测试 2 个完全不同的方案:

@Test
public void testSuccessfulLogin() throws Exception {
    RequestBuilder requestBuilder = formLogin().user("test@tester.de").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("test@tester.de").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("test@tester.de").password("test");
    mockMvc.perform(requestBuilder).andExpect(redirectedUrl("/home")).andExpect(status().is5xxServerError());
}

答案 2

推荐