首页 > 解决方案 > Spring Testing Mock MVC 不应用自定义 RequestMappingHandlerMapping

问题描述

我创建了一个自定义注释来对我的 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。

标签: javaspringspring-bootspring-mvcmockmvc

解决方案


@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 自动配置。


推荐阅读