Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mock Eureka when doing Integration Tests in Spring?

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

like image 953
Keyhan Avatar asked Sep 17 '15 08:09

Keyhan


2 Answers

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.

like image 123
nerdherd Avatar answered Oct 07 '22 20:10

nerdherd


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.

like image 27
Michael Harris Avatar answered Oct 07 '22 21:10

Michael Harris