Spring 模拟 mvc 中的单元测试 404\unknown url

Spring unit test 404\unknown url in mock mvc

我想测试当请求未知 url 并生成 404 错误时,我的网络应用程序实际上重定向到正确的位置。

我没能完成这项工作,我认为是因为 tomcat 正在处理 404 错误,所以 forwardedUrl 对于测试始终为 null。我知道这在现实中有效,因为如果我在 url 中输入一些垃圾,我的应用程序会重定向到我的自定义页面。

我的单元测试看起来像:

@Test
public void testUnknownUrl() throws Exception {
mockMvc.perform(get("/url_doesnt_exist"))
    .andExpect(status().isNotFound())        
    .andExpect(forwardedUrl("/static/error/Sorry.html"));             
}

我的web.xml配置是:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<error-page>
    <error-code>404</error-code>
    <location>/static/error/Sorry.html</location>
</error-page>

/static 的映射在我的 spring 配置中定义如下:

<resources mapping="/static/**" location="/resources/" />

最后我想模拟一个未知的请求 url 然后检查返回的页面是 /static/error/Sorry.html.

我是不是做错了什么,或者这不是在 spring 中处理 404 等的方法?单元测试中转发url的校验一直为空

一个稍微不同但相关的问题是,在什么时候 tomcat 错误处理会在 spring 控制器建议处理之上被调用?

我不确定您 web.xml 中带有 /static 路径的配置,根据您的 dispatcher-servlet(默认名称)配置,它不应该是这样;但据我所知,你走的路是对的。

这是我的:

@WebAppConfiguration
@ActiveProfiles("development")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class ErrorControllerTest {
  @Autowired
  private WebApplicationContext context;
  private MockMvc mockMvc;

  @Before
  public void setUp() {
    mockMvc = MockMvcBuilders.webAppContextSetup(context)/*.alwaysExpect(status().isOk())*/.build();
  }

  @Test
  public void testError() throws Exception {
    mockMvc.perform(get("/error").contentType(MediaType.TEXT_HTML))
        .andExpect(status().isOk()) // See "alwaysExpect" above
        .andExpect(view().name("error"))
        .andExpect(forwardedUrl("/WEB-INF/views/error.jsp"));
  }

  @Test
  public void testResourceNotFound() throws Exception {
    mockMvc.perform(get("/resource-not-found").contentType(MediaType.TEXT_HTML))
        .andExpect(status().isNotFound())
        .andExpect(view().name("resource-not-found"))
        .andExpect(forwardedUrl("/WEB-INF/views/resource-not-found.jsp"));
  }
}

示例项目是 here。我正在使用 JSP,但您只需更改 InternalResourceViewResolver 配置即可切换到 .html

我正在使用 spring 3,经过一番阅读后我发现调度程序 servlet 只是 returns 一个响应代码而没有抛出异常,我想这就是为什么 tomcat 总是处理这个。

从 web.xml 中删除错误页面标签会导致 tomcat 通用 404 页面,所以我认为解决这个问题的方法是升级到 spring 4,然后我可以通过请求它的调度程序 servlet 的初始化参数抛出找不到页面的错误。

我很高兴得到纠正,因为它可能有助于我的理解。