在我的 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)
的 Controller ,它实际上被映射到“/api/todo”
但是在测试中,当我调用 mockMvc.perform(get("/api/todo/"))
时,我得到了 404。我必须调用 get("/todo/")
才能在测试中获得正确的映射。我希望在测试中像实际场景一样映射 Controller 。这可能吗?
我在测试中使用 WebMvcConfigurerAdapter
并尝试过
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**").addResourceLocations("/");
}
但是没有成功。
最佳答案
您会注意到,在设置 MockMvc
配置时,您没有指定部署描述符(即 web.xml)的位置。这是因为 MockMvc
不会测试您的 DispatcherServlet
配置。它测试您的 MVC 配置、@Controller
beans 等。
如果您查看源代码,MockMvc
将创建一个 TestDispatcherServlet
,它会加载并使用您的 Web 应用程序上下文。
换句话说,servlet url-pattern
路径与 MockMvc
无关。您提出请求就好像不存在这样的路径一样。
你说
I hope to map the controller in test like in actual scenario.
您将需要使用不同的测试策略。完全部署您的 Web 应用程序并使用 HTTP 客户端发出请求并验证您返回的内容。
您已标记单元测试
。完整环境中的测试不是单元测试,而是集成和系统测试。
请注意这一点
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**").addResourceLocations("/");
}
与以上无关。它的目的是从 web 应用程序中的某个路径提供静态资源。它与您的 servlet 的 url-pattern
或 Controller 的路径无关。
关于java - 如何在 Spring MVC REST 测试中重定向模拟请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20009309/