从 Spring-Boot 测试中排除 elasticsearchTemplate

Posted

技术标签:

【中文标题】从 Spring-Boot 测试中排除 elasticsearchTemplate【英文标题】:Exclude elasticsearchTemplate from Spring-Boot Test 【发布时间】:2022-01-08 12:14:27 【问题描述】:

我有一个使用 Elasticsearch 的应用程序,我想在测试某些控制器时禁用此集成。如何在 Spring-Boot 测试中禁用 elasticsearchTemplate?

Application.class:

@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.closeupinternational.comclosure.elasticsearch")
public class Application 
...

Repository.class:

@Repository
public interface PipelineRepository extends ElasticsearchRepository<Pipeline, String> 
...

测试Controller.class:

@ExtendWith(SpringExtension.class)
@EnableAutoConfiguration(exclude = ElasticsearchDataAutoConfiguration.class,
ElasticsearchRepositoriesAutoConfiguration.class)
@WebMvcTest(ProductionCycleExecutionController.class)
@Slf4j
public class ProductionCycleExecutionControllerTest 

    @Autowired
    private MockMvc mvc;

    @MockBean
    private ProductionCycleExecutionService prodCycleExecService;

    ...

我没有在 ProductionCycleExecutionService 内部使用,我现在不想尝试测试 elasticsearch 存储库 PipelineRepository。

错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pipelineRepository' defined in 
com.closeupinternational.comclosure.elasticsearch.PipelineRepository defined in
 @EnableElasticsearchRepositories declared on Application: Cannot resolve reference to bean 
'elasticsearchTemplate' while setting bean property 'elasticsearchOperations'; nested exception is org.springframework.beans.factory

【问题讨论】:

【参考方案1】:

只需删除 @ExtendWith(SpringExtension.class)@EnableAutoConfiguration(exclude = ElasticsearchDataAutoConfiguration.class, ElasticsearchRepositoriesAutoConfiguration.class)

这些注解旨在引导整个 Spring 上下文并对其进行配置

@WebMvcTest 在您的情况下应该足够了,因为它仅引导与网络相关的上下文

更新

如果您的ProductionCycleExecutionController 中有任何依赖项(如您提到的elasticsearchTemplate),那么如果您不需要定义它们的行为,请像这样模拟它们,如下所示:

@MockBeans(value = @MockBean(YourBean1.class), @MockBean(YourBean2.class), @MockBean(YourBean3.class))

如果您确实需要定义模拟行为,请在类中模拟为属性:

@MockBean
private YourBean yourBean;

【讨论】:

同样的错误:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'elasticsearchTemplate' available @AldoInáciodaSilva 请查看我的更新答案 在测试这部分系统时,我对 elasticsearch 没有任何依赖关系。你认为是因为我在 /test/application.yml 中定义了 elasticsearch 属性吗? 尝试将elasticsearchTemplate也添加到@MockBeans 我将PipelineRepository 添加为@MockBean,但这是多余的,因为我需要将此引用放在我所有的测试类中。

以上是关于从 Spring-Boot 测试中排除 elasticsearchTemplate的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot Amazon Elastic Beanstalk 忽略“SPRING_APPLICATION_JSON”

Spring-Boot REST 服务基本 http 身份验证排除一个端点

如何从 Actuator /metrics 端点中排除 Hystrix Metrics?

Maven 从 WAR 中排除配置处理器包

如何从使用云侦探的跟踪中排除一些使用 Feign 的调用

Elasticsearch:管理 Elasticsearch 内存并进行故障排除