2013-11-15 61 views
1

在我的web.xml我映射的servlet/API这样的:如何在Spring MVC REST测试中重定向重定向模拟请求?

<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("/"); 
} 

,但没有奏效。

回答

1

当您设置MockMvc配置时,您会注意到您没有指定部署描述符的位置,即web.xml。这是因为MockMvc未测试您的DispatcherServlet的配置。它测试你的MVC配置,@Controller豆等。

如果您查看源代码,MockMvc会创建一个加载并使用您的Web应用程序上下文的TestDispatcherServlet

换句话说,servlet url-pattern路径与MockMvc无关。你提出你的请求,好像没有这样的路径。

幽州

我希望在测试控制器映射像实际场景。

您需要使用不同的测试策略。完全部署您的Web应用程序并使用HTTP客户端发出请求并验证您返回的内容。

您已标记为unit-testing。在完整的环境中测试不是单元测试,而是集成和系统测试。


注意,这

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/api/**").addResourceLocations("/"); 
} 

无关上述。它的目的是在你的web应用程序中为某些路径提供静态资源。它与你的servlet的url-pattern或你的控制器的路径无关。

+0

这很有道理。谢谢。 – NSF