How to mock Eureka when doing Integration Tests in

2020-07-08 06:18发布

问题:

I am running a simple Junit Testing a Controller in Spring Boot. The test code looks like this:

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

In the application-integrationTest.properties I have the following Eureka Settings:

####### 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

when a junit test started I see the following:

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]

The test passes, that is not the problem, but I see a lot of exception stack traces that has to do with Eureka. The questions is if there is a way to mock eureka or another way to skip brining it up when doing tests?

The benefit would be easier to see relevant stack traces if test would fail and tst would run much faster

回答1:

Another solution is to disable the Eureka Client in your application.properties or application.yml file under test/resources

applications.properties:

eureka.client.enabled=false

application.yml:

eureka: client: enabled: false

This has the benefit of not needing to remeber to include the system property for every JUnit test that requires disabling the Eureka Client.



回答2:

You can set a system property for eureka.client.enabled=false for tests.

If you're running the tests using gradle you can do this:

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

If you're running tests in an IDE then you'll have to set the system property there as well.