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 的初始化参数抛出找不到页面的错误。
我很高兴得到纠正,因为它可能有助于我的理解。
我想测试当请求未知 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 的初始化参数抛出找不到页面的错误。
我很高兴得到纠正,因为它可能有助于我的理解。