如何测试控制器方法是否将请求转发到特定的 URL?

How to test if a controller method forwards the requests to a specific URL?

在我的 Spring 引导应用程序中,我有以下控制器,它使用一个方法将所有 HTML5 路由重定向到根目录 URL**:

@Controller
public class RedirectController {

  @RequestMapping(value = "/**/{path:[^\.]*}")
  public String redirect() {
    return "forward:/";
  }
}

我应该如何正确测试它是否按预期工作?

调用 MockMvcResultMatchers class 的 content() 方法无效:

  @Test
  public void givenPathWithoutDotShouldReturnString() throws Exception {
    this.mockMvc.perform(get("/somePath"))
        .andExpect(content().string("forward:/"));
  }

>>> java.lang.AssertionError: Response content 
>>> Expected :forward:/
>>> Actual   :

** 我通过关注 this Spring tutorial.

找到了这个解决方案

当我调用 mockMvc class 的 andDo(print()) 时,我得到以下结果:

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {}
     Content type = null
             Body = 
    Forwarded URL = /
   Redirected URL = null
          Cookies = []

这里我意识到Spring并不是把return "forward:/";当做一个简单的String结果,而是一个URL转发(某种程度上很明显),所以正确的做法编写测试是通过使用 forwardedUrl("/") 作为参数调用 .andExpect() 方法:

  @Test
  public void givenPathWithoutDotShouldReturnString() throws Exception {
    this.mockMvc.perform(get("/somePath"))
        .andExpect(forwardedUrl("/"));
  }

forwardedUrl()方法来自org.springframework.test.web.servlet.result.MockMvcResultMatchers.