使用 MockMvc 自定义 RequestMappingHandlerMapping

Custom RequestMappingHandlerMapping with MockMvc

我有一个自定义 RequestMappingHandlerMapping class,它将特殊注释解释为其映射标准的一部分。因此,它被实例化为一个 bean:

@Configuration
@EnableWebMvc
public class ConfigServletConfig extends WebMvcConfigurerAdapter {
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = new VersionRangeRequestMappingHandlerMapping();
        handlerMapping.setOrder(0);
        return handlerMapping;
    }
}

但是当我创建一个用于测试的 MockMvc 对象(使用 standaloneSetup)时,这个映射处理程序没有被使用。如果不考虑额外的注释,映射将失败,因为我有多个控制器方法具有相同的@RequestMapping。注释是它们的区别。

如何配置 MockMvc 以使用此自定义映射处理程序?

How can I configure MockMvc to use this custom mapping handler?

从 Spring Framework 4.3.x 开始,目前无法使用 MockMvcstandaloneSetup() 构建器注册自定义 RequestMappingHandlerMapping

但是,该团队正在考虑在 Spring Framework 5.0 中添加此类支持。

有关详细信息,请参阅 SPR-15472

您可以通过覆盖WebMvcConfigurerAdapter 的getRequestMappingHandlerMapping 方法进行配置。

@Configuration
public class ConfigServletConfig extends WebMvcConfigurerAdapter {

    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = new VersionRangeRequestMappingHandlerMapping();
        handlerMapping.setOrder(0);
        return handlerMapping;
    }
}

对于那些仍在搜索中的人,自从 Spring 更新到版本 5.0(我相信)以来,引入了自定义 MockMvc requestHandlerMapping 配置。

用法示例:

MockMvcBuilders.standaloneSetup(new MyAwesomeController())
        .setCustomHandlerMapping(() -> new MyAwesomeRequestMappingHandlerMapping())
        .build();