Spring Boot测试如何禁用elasticsearchTemplate排除Elasticsearch集成
@EnableElasticsearchRepositories 注解直接标注在主启动类上,属于硬编码开启ES仓库扫描,优先级高于已排除的ES自动配置类。即使排除了自动配置,Spring启动时扫描到主启动类的该注解,仍会尝试实例化所有继承了ElasticsearchRepository的接口(含PipelineRepository),但又因为ES自动配置被排除导致无elasticsearchTemplate实例,因此抛出依赖缺失错误。
方案1:给ES仓库开启注解加条件控制(侵入性最小,推荐)
修改主启动类的@EnableElasticsearchRepositories,搭配条件注解控制开启逻辑:
@SpringBootApplication @ConditionalOnProperty(name = "elasticsearch.repositories.enabled", havingValue = "true", matchIfMissing = true) @EnableElasticsearchRepositories(basePackages = "你的ES仓库包路径") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
然后在测试类对应的application-test.properties(或yaml)中添加配置:
elasticsearch.repositories.enabled=false
保留原有排除ES自动配置的配置即可,测试时不会再扫描实例化ES相关的Repository。
方案2:测试类指定加载Bean范围,不加载主启动类
使用@WebMvcTest的classes属性,仅指定你需要加载的控制器、依赖的Service,避免加载带@EnableElasticsearchRepositories的主启动类:
@WebMvcTest(controllers = 目标控制器类.class, classes = {ProductionCycleExecutionService.class}) @EnableAutoConfiguration(exclude = {ElasticsearchDataAutoConfiguration.class, ElasticsearchRepositoriesAutoConfiguration.class}) public class 你的测试类 { // 测试逻辑 }
这种方式完全不会触发主启动类的ES仓库扫描逻辑,自然不会创建PipelineRepository Bean。
方案3:Mock缺失的ES相关Bean
如果不想修改主启动类代码,直接在测试类上加@MockBean注解,把PipelineRepository或ElasticsearchTemplate mock掉,填充Spring的依赖缺口:
@WebMvcTest(目标控制器类.class) @EnableAutoConfiguration(exclude = {ElasticsearchDataAutoConfiguration.class, ElasticsearchRepositoriesAutoConfiguration.class}) @MockBean(PipelineRepository.class) public class 你的测试类 { // 测试逻辑 }
测试逻辑完全不会用到PipelineRepository,mock之后不会影响正常测试流程。
内容的提问来源于stack exchange,提问作者Aldo Inácio da Silva

