在我的web.xml中,将servlet映射到/ api就像这样:
<servlet-mapping>
<servlet-name>todo</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>todo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
因此,对于使用的控制器@RequestMapping(value = "/todo", method = RequestMethod.GET)
,它实际上已映射到“ / api / todo”
但是在测试中,当我打电话给mockMvc.perform(get("/api/todo/"))
我时,得到了404。我必须打电话get("/todo/")
以获取测试中的正确映射。我希望像实际情况一样在测试中映射控制器。那可能吗?
我WebMvcConfigurerAdapter
在测试中使用,我尝试了
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**").addResourceLocations("/");
}
但这没用。
在设置MockMvc
配置时,您会注意到没有指定部署描述符的位置web.xml。那是因为MockMvc
不会测试您对的配置DispatcherServlet
。它测试您的MVC配置,@Controller
bean等。
如果您查看源代码,则MockMvc
创建一个TestDispatcherServlet
加载并使用您的Web应用程序上下文。
换句话说,Servleturl-pattern
路径与无关MockMvc
。您发出的请求就好像没有这样的路径。
你说
我希望像实际情况一样在测试中映射控制器。
您将需要使用其他测试策略。完全部署您的Web应用程序,并使用HTTP客户端发出请求并验证您获得的回报。
您已标记了unit-testing
。完整环境中的测试不是单元测试,而是集成和系统测试。
请注意
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**").addResourceLocations("/");
}
与以上无关。其目的是从Web应用程序中的某些路径提供静态资源。它与您的servleturl-pattern
或控制器的路径无关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句