代码之家  ›  专栏  ›  技术社区  ›  Martin Ahrer

SpringMVC测试MockMvc—如何配置url映射前缀

  •  0
  • Martin Ahrer  · 技术社区  · 5 年前

    我有一个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')
        }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Sam Brannen    5 年前

    我想你只需要配置 contextPath 为了请求。

    org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.contextPath(String) 了解详情。