MockMvc WebAppConfiguration:在web.xml中加载servlet映射

时间:2014-08-12 17:09:09

标签: spring-test spring-test-mvc mockmvc

我正在使用MockMvc编写集成测试,我想知道是否有一种方法可以从web.xml加载servlet映射(这通常无关紧要)。

我有一个自定义HandlerInteceptor,它将请求URI(来自HttpServletRequest)与模板(使用AntPathMatcher)匹配。

在web.xml中,我定义了这样的servlet映射(带有相应的mobile-context.xml):

<servlet-mapping>
    <servlet-name>mobileServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>

因此,当控制器定义类似"/operation"的映射时,应该真正向"/services/operation"发出请求。我的自定义HandlerInterceptor会针对"/**/services/{operationName}/**"等模板的URI请求进行匹配。

我的应用程序在Tomcat上完美运行。但是,在@ContextConfiguration中,我只能指定mobile-context.xml,因为web.xml不是spring配置文件。因此,MockMvc只允许我向"/operation"而不是"/services/operation"发出请求,导致我的HandlerInterceptor抛出异常。

有没有办法让MockMvc注册servlet映射,或任何巧妙的方法?提前谢谢。

编辑: 这里similar question表示我需要的是不可能的,但我无权更改源代码,因此我无法修改模板或HandlerInterceptor

2 个答案:

答案 0 :(得分:3)

我正在使用MockMvc和MockMvcHtmlUnitDriver来测试我的应用程序中的导航流程。我遇到了MockMvc无法加载我的javascript资源的问题,因为我的servlet映射是

<url-pattern>/ui/*</url-pattern>

因为我的导航流程是一系列的帖子和获取,我不能简单地在MockMvcBuilder上设置defaultRequest。我通过创建一个MockMvcConfigurer解决了我的问题:

public class ServletPathConfigurer implements MockMvcConfigurer {

private final String urlPattern;
private final String replacement;


public ServletPathConfigurer(String urlPattern, String replacement) {
    super();
    this.urlPattern = urlPattern;
    this.replacement = replacement;
}

@Override
public RequestPostProcessor beforeMockMvcCreated(
        ConfigurableMockMvcBuilder<?> builder,
        WebApplicationContext context) {

 return new RequestPostProcessor(){

        @Override
        public MockHttpServletRequest postProcessRequest(
                MockHttpServletRequest request) {                        
                 request.setRequestURI(StringUtils.replace(request.getRequestURI(), urlPattern, replacement, 1));
                 request.setServletPath(StringUtils.replace(request.getServletPath(), urlPattern, replacement, 1));
            return request;
        }
    };
}

然后将其添加到我的每个集成测试中:

MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context)
            .apply(new ServletPathConfigurer("/ui",""))
            .alwaysDo(print())
            .build();

答案 1 :(得分:1)

无法加载web.xml映射。但是,您可以在请求上显式设置上下文路径,servlet路径和路径信息。有关MockHttpServletRequestBuilder中的那些方法,请参阅Javadoc。