Spring MVC Test MockMvc-如何配置URL映射前缀

时间:2019-06-18 14:39:58

标签: spring-security spring-test-mvc

我有一个DispatcherServlet,它的URL映射为/api1,随后有一个Controller的Controller为映射的@GetMapping("/resource1")。因此,基本上我有一个有效的URL /api1/resource1,应由上述控制器处理。

此外,该设置还包含一个与请求/*相匹配的Spring Security过滤器,因为它可以保护Spring未处理的其他URL(例如,泽西岛)。 由Spring Security Filter保护的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框架。 所有的安全检查都通过了,因此Spring安全性设置已经完成,但是最后应该调用控制器,但是失败并显示404状态,即找不到资源-这是映射的控制器方法。

我相信它会失败,因为模拟设置未包含/api调度程序servlet映射。为了证明这一假设,我可以将控制器方法映射修改为@GetMapping("/api1/resource1"),然后测试将得出HTTP OK(200)。

所以,我的问题是,是否可以在MockMvc设置中配置一种URL前缀? 有一个约束,代码库未使用Spring Boot(并且以后可能不会使用)!

编辑: 我在测试中添加了以下内容,以使所有请求都设置ServletPath。

    static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
        new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars)
                .servletPath('/api1')
    }

1 个答案:

答案 0 :(得分:1)

我认为您只需要为请求配置contextPath

有关详细信息,请参见org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.contextPath(String)