【问题标题】:How to mock Eureka when doing Integration Tests in Spring?在 Spring 中进行集成测试时如何模拟 Eureka?
【发布时间】:2015-12-14 01:41:08
【问题描述】:

我正在 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 {

在 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

当 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 有关的异常堆栈跟踪。问题是是否有一种方法可以模拟 eureka 或其他方式在进行测试时跳过它?

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

【问题讨论】:

    标签: spring spring-test spring-test-mvc netflix-eureka


    【解决方案1】:

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

    applications.properties:

    eureka.client.enabled=false

    application.yml:

    eureka: client: enabled: false

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

    【讨论】:

    • 我认为这应该是公认的答案。非常适合懒惰和聪明的开发者。
    • 谢谢维克多,我很感激!
    • 如果使用配置文件运行 spring,请将其放入 application-test.yml,然后注释您的测试 @ActiveProfiles("test")
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不错。这解决了我的问题。此注解可防止通过集成测试向 eureka 注册 @WebIntegrationTest({"server.port:0", "eureka.client.enabled:false"})
    • 当然,现在是@SpringBootTest({"server.port:0", "eureka.client.enabled:false"})
    • @SpringBootTest 从 Spring Boot 1.4.0.M2 开始可用
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2018-08-14
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多