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

标签 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) 的 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/

相关文章:

java - 通过 UDP 套接字发送数据包

Java:从类创建一个新数组

java - 将过滤器添加到 web.xml 后,一个或多个过滤器无法启动

跨 AWS 集群的 Spring、Tomcat 8 Ehcache 复制(在 EC2 实例上)

java - Heroku 上使用 Maven 加载 Postgres 驱动程序

java - 抛出 Java 异常

java - @TestPropertySource 注解替代方法级别

unit-testing - 使用测试/资源文件来比较单元测试输出=代码味道?

javascript - 如何将 ES6 类模块导入 Jasmine 进行测试?

c++ - kill syscommand 在 Catch2 测试用例中产生失败