我正在使用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
。
答案 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。