【问题标题】:How to redirect redirect mock requests in Spring MVC REST test?如何在 Spring MVC REST 测试中重定向重定向模拟请求?
【发布时间】:2013-11-15 19:43:01
【问题描述】:

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

但是没有用。

【问题讨论】:

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


    【解决方案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 或控制器的路径无关。

    【讨论】:

    • 这是有道理的。谢谢。
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2016-04-08
    • 2012-02-28
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多