春季测试版MVC没有应用自定义RequestMappingHandlerMapping

时间:2019-03-08 02:47:55

标签: java spring spring-boot spring-mvc mockmvc

我创建了一个自定义注释以对API进行版本控制。

运行应用程序时一切正常。

但是,当我尝试使用MockMvc测试我的控制器时,我编写的自定义RequestMappingHandlerMapping未得到应用。

我正在像这样初始化MockMvc

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .apply(documentationConfiguration(this.restDocumentation))
            .apply(springSecurity())
            .build();
    }

我覆盖默认设置以使用我的自定义RequestMappingHandlerMapping

@Configuration
public class RoutingConfig {
    @Bean
    public WebMvcRegistrations webMvcRegistrationsPathHandlerMapping() {
        return new WebMvcRegistrations() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new APIPathRequestHandlerMapping();
            }
        };
    }
}

知道发生了什么吗?我认为MockMvc的Web应用程序上下文初始化将默认接收所有配置更改。

编辑1:

我还应该补充一点,我正在使用Spring Boot 2.1.2.RELEASE

编辑2: 需要说明的是,版本控制注释在应用于控制器时会接受以版本开头的请求,即:/users变为/v1/users

这可以处理正常的请求,但是对于只有/users的测试有效,/v1/users返回404(未找到)

我已将调试点放置在配置和自定义RequestMappingHandlerMapping中,并确保MockMvc不会将其删除。

我曾尝试自动装配MockMvc,但相同的行为仍然存在,还有一个额外的问题,就是无法配置Spring RestDocs。

1 个答案:

答案 0 :(得分:0)

  

@AutoConfigureMockMvc 注释,可以将其应用于测试类以启用和配置MockMvc的自动配置。

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoApplicationTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void contextLoads() {        
        System.out.println("test "+mockMvc);
    }
}

注意:我应用了自定义RequestMappingHandlerMapping,它已成功应用于MockMvc自动配置。