Spring Consul - 禁用单元测试

Spring Consul - disable for unit tests

已更新

下面列出的我的 class (ServiceDiscoveryConfiguration) 从未被使用过。即使我删除 @EnableDiscoveryClient 以尝试完全避免设置,它仍然会尝试连接到 Consul。

唯一对我有用的是完全删除 Consul Maven 依赖项:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

如果不通过配置文件和注释设置,我能做些什么来阻止 Consul 运行 进行单元测试?

原创

我有一个使用 Spring Consul 的应用程序。 我有一个 class 设置来启用这样的发现:

@Profile ("!" + Profiles.UNIT_TEST)
@Configuration
@EnableDiscoveryClient
public class ServiceDiscoveryConfiguration {
}

如果我没记错的话,应该禁用 Consul 部分。基础测试 class(它是我所有单元测试之间共享的 abstract)设置有以下注释。这就是我认为问题所在。

@SpringBootTest (classes = Service.class)
@WebAppConfiguration
@TestExecutionListeners (...)
@DirtiesContext
@ActiveProfiles (Profiles.UNIT_TEST)
@Test (...)
public abstract class AbstractBootTest extends AbstractTestNGSpringContextTests {
  // ...
}

当我执行测试时,我得到:

Caused by: com.ecwid.consul.transport.TransportException: java.net.ConnectException: Connection refused

这让我相信配置文件激活不起作用,或者我使用 @Profile 规范中的 ! 运算符的语法没有按照我认为应该的方式进行。 root 执行 class 本身有基本的注释,包括一个 @ComponentScan 注释,我知道它有适当的包被扫描。

援助?

配置文件注释正确

@Profile ("!" + Profiles.UNIT_TEST) 

配置文件激活看起来还不错,

@ActiveProfiles (Profiles.UNIT_TEST)

您写道您正在使用 ComponentScan,这很重要,因为如果 bean 是通过 @Bean 注释方法实例化的,则 bean 上的 @Profile 注释将被忽略。也许你再检查一下,看看,这不会发生?

要缩小问题范围,您可以尝试:

在ServiceDiscoveryConfiguration的构造函数中打断点,看是否实例化

删除@EnableDiscoveryClient 看看这是否真的是您问题的原因

问题是,如果你在类路径中有 spring-consul,它无论如何都会尝试自动配置它

您可以通过

禁用
@TestPropertySource(properties = {"spring.cloud.consul.config.enabled=false"})

在 application.properties 文件的 属性 下方添加 test/resources

spring.cloud.discovery.enabled=false
spring.cloud.consul.enabled=false
spring.cloud.consul.config.enabled=false

这将在测试您的应用程序时禁用 consul 集成

如果您的项目中有 bootstrap.properties 文件,您应该在 test/resources 下创建 bootstrap.properties 文件:

spring.application.name=<service-name>
spring.cloud.bus.enabled=false
spring.cloud.discovery.enabled=false
spring.cloud.consul.enabled=false
spring.cloud.consul.config.enabled=false

这将在测试中禁用 consul 集成