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

12

我是一个简单的Junit测试Spring Boot控制器。测试代码如下:

@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 {

在应用程序的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

当一个junit测试开始时,我看到以下内容:
2015-09-16 16:46:03,905 ERROR localhost-startStop-1 com.netflix.discovery.DiscoveryClient 无法从http://localhost:8767/eureka/apps/获得响应/ 无法联系任何eureka节点 - 可能是安全组问题? 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有关的异常堆栈跟踪。问题是是否有一种方法可以模拟eureka或另一种在进行测试时跳过它的方式?
好处是如果测试失败,更容易看到相关的堆栈跟踪,并且测试运行速度更快。
2个回答

27
另一个解决方案是在测试资源下的应用程序属性或应用程序.yml文件中禁用Eureka Client。
applications.properties:
```eureka.client.enabled=false```
application.yml:
```eureka: client: enabled: false ```
这样做的好处是不需要为每个需要禁用Eureka Client的JUnit测试都记住包含系统属性。

1
在我看来,这应该是被接受的答案。非常适合懒惰而聪明的开发者。 - Víctor Herraiz
谢谢Victor,我很感激! - Michael Harris
如果使用Spring的配置文件,请将以下内容放入application-test.yml中,然后在测试中添加注释@ActiveProfiles("test")。 - Andreas Lundgren

13

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

如果您正在使用Gradle运行测试,您可以这样做:

tasks.withType(Test) {
    systemProperty 'eureka.client.enabled', 'false'
}

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


2
很好,这解决了我的问题。这个注释可以防止在集成测试中向Eureka注册 @WebIntegrationTest({"server.port:0", "eureka.client.enabled:false"}) - rixmath
4
当然,目前来看,这是 @SpringBootTest({"server.port:0", "eureka.client.enabled:false"}) - Michael Piefel
@SpringBootTest 从 Spring Boot 1.4.0.M2 开始可用。 - nerdherd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接