从 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 身份验证排除一个端点