如何在Spring中进行集成测试时模拟Eureka?

Key*_*han 8 spring spring-test spring-test-mvc netflix-eureka

我在Spring Boot中运行一个简单的Junit测试控制器.测试代码如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {FrontControllerApplication.class})
@WebAppConfiguration
@ComponentScan
@IntegrationTest({"server.port:0", "eureka.client.registerWithEureka:false", "eureka.client.fetchRegistry:false"})
@ActiveProfiles("integrationTest")
public class MyControllerIT {
Run Code Online (Sandbox Code Playgroud)

在application-integrationTest.properties中,我有以下Eureka设置:

####### Eureka
eureka.serviceUrl.default=http://localhost:8767/eureka/
eureka.printDeltaFullDiff=false
eureka.client.refresh.interval=1
eureka.appinfo.replicate.interval=1
eureka.serviceUrlPollIntervalMs=1000
eureka.name=${spring.application.name}

####### Netflix Eureka #######
eureka.client.serviceUrl.defaultZone=http://localhost:8767/eureka/
eureka.client.instanceInfoReplicationIntervalSeconds=1
eureka.client.initialInstanceInfoReplicationIntervalSeconds=0
eureka.instance.virtualHostName=${spring.application.name}
eureka.instance.preferIpAddress=true
eureka.instance.initialStatus=DOWN
eureka.instance.leaseRenewalIntervalInSeconds=3
eureka.instance.leaseExpirationDurationInSeconds=10
eureka.instance.metadataMap.instanceId=${spring.application.name}:${spring.application.instance_id:${random.value}}
eureka.eurekaserver.connectionIdleTimeoutInSeconds=5
eureka.responseCacheAutoExpirationInSeconds=5
Run Code Online (Sandbox Code Playgroud)

当junit测试开始时,我看到以下内容:

2015-09-16 16:46:03,905 ERROR localhost-startStop-1 com.netflix.discovery.DiscoveryClient Can't get a response from http://localhost:8767/eureka/apps/ Can't contact any eureka nodes - possibly a security group issue? com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:184) ~[jersey-apache-client4-1.11.jar:1.11]

测试通过,这不是问题,但我看到很多与Eureka有关的异常堆栈跟踪.问题是,是否有办法模拟尤里卡或其他方式在进行测试时跳过它?

如果测试失败并且tst运行得更快,则更容易看到相关的堆栈跟踪

Mic*_*ris 22

另一种解决方案是在test/resources下的application.properties或application.yml文件中禁用Eureka Client

applications.properties:

eureka.client.enabled=false

application.yml:

eureka: client: enabled: false

这样做的好处是不需要记住为每个需要禁用Eureka客户端的JUnit测试包含系统属性.


ner*_*erd 11

您可以eureka.client.enabled=false为测试设置系统属性.

如果您使用gradle运行测试,则可以执行以下操作:

tasks.withType(Test) {
    systemProperty 'eureka.client.enabled', 'false'
}
Run Code Online (Sandbox Code Playgroud)

如果您在IDE中运行测试,那么您还必须在那里设置系统属性.

  • 当然,截至目前,这是`@SpringBootTest({"server.port:0","eureka.client.enabled:false"})` (3认同)
  • 尼斯.这解决了我的问题.这个注释可以防止在集成测试中注册eureka` @ WebIntegrationTest({"server.port:0","eureka.client.enabled:false"}) (2认同)