如何在Spring MVC REST测试中重定向重定向模拟请求?

时间:2013-11-15 19:43:02

标签: java spring unit-testing spring-mvc integration-testing

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

但它不起作用。

1 个答案:

答案 0 :(得分:1)

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

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

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

你陈述

  

我希望像实际情况一样在测试中映射控制器。

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

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


注意这个

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

与上述无关。其目的是从webapp中的某个路径提供静态资源。它与servlet的url-pattern或控制器的路径无关。