我有一个DispatcherServlet,它有一个URL映射
/api1
接下来是一个带映射的控制器
@GetMapping("/resource1")
对于控制器方法。所以基本上我有一个有效的网址
/api1/resource1
这应该由上述控制器处理。
此外,该设置还包含了一个与请求匹配的Spring安全过滤器
/*
因为它保护了Spring不处理的其他url(比如Jersey)。
由Spring安全过滤器保护的API的设置如下
protected void configure(HttpSecurity http) throws Exception {
//@formatter:off
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.requestMatchers()
.antMatchers("/api1/**")
.and()
.authorizeRequests()
.antMatchers("/**")
.authenticated()
为了进行测试,我使用MockMvc*支持来设置模拟的web环境,包括Spring安全设置
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build()
我想测试是否应用了安全检查,并且在安全检查成功时调用了controller方法。
when:
def result = mvc.perform(
get('/api1/resource1')
.header(HttpHeaders.AUTHORIZATION, "Bearer " + apiToken))
then:
result.andExpect(status().isOk())
上面的代码基于带有MockMvc的Spock框架。
我确信它会失败,因为模拟设置没有包含
/api
调度程序servlet映射。为了证明这个假设,我可以修改控制器方法映射到
@GetMapping("/api1/resource1")
测试将得到一个httpok(200)。
所以,我的问题是,是否可以在MockMvc设置中配置一种URL前缀?
有一个限制,代码库没有使用springboot(在未来的一段时间内不能使用)!
:
我在测试中添加了以下内容,以使所有请求都设置servletPath。
static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars)
.servletPath('/api1')
}