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

Posted

技术标签:

【中文标题】使用 MockMvc 测试重定向 URL 的 HTTP 状态码【英文标题】:Test HTTP status code of redirected URL with MockMvc 【发布时间】:2017-04-29 19:10:50 【问题描述】:

我想使用 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状态码。假设 /home-page 返回 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());

【讨论】:

以上是关于使用 MockMvc 测试重定向 URL 的 HTTP 状态码的主要内容,如果未能解决你的问题,请参考以下文章

Azure Active Directory 中的 URL 重定向

如何使用 htaccess 将非 www 重定向到 www URL?

使用 Vue.js 和 Jest 进行 URL 重定向测试

当url具有相同的基础时如何编写301重定向规则

将页面重定向到新URL而不会丢失SEO

验收测试重定向到特定的 URL