diff --git a/pom.xml b/pom.xml index 51049478d1..b9ad39a70d 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 5.12.1 2.17.0 1.0.2.RELEASE - 1.4.0.RC1 + 1.4.0.RELEASE diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerDiscoveryClient.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerDiscoveryClient.java index eeff4e92d3..928197f402 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerDiscoveryClient.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerDiscoveryClient.java @@ -46,12 +46,19 @@ class StubRunnerDiscoveryClient implements DiscoveryClient { public StubRunnerDiscoveryClient(DiscoveryClient delegate, StubFinder stubFinder, StubMapperProperties stubMapperProperties, String springAppName) { - this.delegate = delegate instanceof StubRunnerDiscoveryClient ? + this.delegate = delegate instanceof StubRunnerDiscoveryClient ? noOpDiscoveryClient(springAppName) : delegate; this.stubFinder = stubFinder; this.stubMapperProperties = stubMapperProperties; } + public StubRunnerDiscoveryClient(StubFinder stubFinder, + StubMapperProperties stubMapperProperties, String springAppName) { + this.delegate = noOpDiscoveryClient(springAppName); + this.stubFinder = stubFinder; + this.stubMapperProperties = stubMapperProperties; + } + private NoopDiscoveryClient noOpDiscoveryClient(String springAppName) { return new NoopDiscoveryClient(new DefaultServiceInstance(springAppName, "localhost", 0, false)); } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfiguration.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfiguration.java index 7c312a6e63..64bdef7d7c 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfiguration.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.cloud.contract.stubrunner.spring.cloud; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -46,12 +47,21 @@ public class StubRunnerSpringCloudAutoConfiguration { } @Bean + @ConditionalOnBean(DiscoveryClient.class) @Primary - public DiscoveryClient stubRunnerDiscoveryClient(DiscoveryClient discoveryClient, + public DiscoveryClient stubRunnerDiscoveryClientWrapper(DiscoveryClient discoveryClient, StubFinder stubFinder, StubMapperProperties stubMapperProperties, @Value("${spring.application.name:unknown}") String springAppName) { return new StubRunnerDiscoveryClient(discoveryClient, stubFinder, stubMapperProperties, springAppName); } + @Bean + @ConditionalOnMissingBean(DiscoveryClient.class) + public DiscoveryClient stubRunnerDiscoveryClient(StubFinder stubFinder, + StubMapperProperties stubMapperProperties, + @Value("${spring.application.name:unknown}") String springAppName) { + return new StubRunnerDiscoveryClient(stubFinder, stubMapperProperties, springAppName); + } + } diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy index 7c0cd09da0..8af8d00144 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy @@ -21,9 +21,8 @@ import org.junit.AfterClass import org.junit.BeforeClass import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.EnableAutoConfiguration -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.WebIntegrationTest import org.springframework.boot.test.context.SpringBootContextLoader +import org.springframework.boot.test.context.SpringBootTest import org.springframework.cloud.client.discovery.EnableDiscoveryClient import org.springframework.cloud.client.loadbalancer.LoadBalanced import org.springframework.cloud.contract.stubrunner.StubFinder @@ -37,22 +36,19 @@ import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import org.springframework.util.SocketUtils import org.springframework.web.client.RestTemplate - import spock.lang.Specification - /** * @author Marcin Grzejszczak */ @ContextConfiguration(classes = Config, loader = SpringBootContextLoader) -@WebIntegrationTest(randomPort = true) -@IntegrationTest("stubrunner.camel.enabled=false") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = ["stubrunner.camel.enabled=false"]) @AutoConfigureStubRunner @DirtiesContext class StubRunnerSpringCloudAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder @Autowired @LoadBalanced RestTemplate restTemplate - // TODO: this shouldn't be needed? @Autowired ZookeeperServiceDiscovery zookeeperServiceDiscovery @Autowired ConfigurableApplicationContext applicationContext diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationWithoutDiscoverySpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationWithoutDiscoverySpec.groovy new file mode 100644 index 0000000000..d20c0e153e --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationWithoutDiscoverySpec.groovy @@ -0,0 +1,80 @@ +/* + * Copyright 2013-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.stubrunner.spring.cloud + +import org.junit.AfterClass +import org.junit.BeforeClass +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.EnableAutoConfiguration +import org.springframework.boot.test.context.SpringBootContextLoader +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.cloud.client.discovery.EnableDiscoveryClient +import org.springframework.cloud.client.loadbalancer.LoadBalanced +import org.springframework.cloud.contract.stubrunner.StubFinder +import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner +import org.springframework.cloud.zookeeper.discovery.RibbonZookeeperAutoConfiguration +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.test.annotation.DirtiesContext +import org.springframework.test.context.ContextConfiguration +import org.springframework.web.client.RestTemplate +import spock.lang.Specification +/** + * @author Marcin Grzejszczak + */ +@ContextConfiguration(classes = Config, loader = SpringBootContextLoader) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = ["stubrunner.camel.enabled=false", + "spring.cloud.zookeeper.enabled=false", + "spring.cloud.zookeeper.discovery.enabled=false"]) +@AutoConfigureStubRunner +@DirtiesContext +class StubRunnerSpringCloudAutoConfigurationWithoutDiscoverySpec extends Specification { + + @Autowired StubFinder stubFinder + @Autowired @LoadBalanced RestTemplate restTemplate + + @BeforeClass + @AfterClass + static void setupProps() { + System.clearProperty("stubrunner.stubs.repository.root"); + System.clearProperty("stubrunner.stubs.classifier"); + } + + // tag::test[] + def 'should make service discovery work'() { + expect: 'WireMocks are running' + "${stubFinder.findStubUrl('loanIssuance').toString()}/name".toURL().text == 'loanIssuance' + "${stubFinder.findStubUrl('fraudDetectionServer').toString()}/name".toURL().text == 'fraudDetectionServer' + and: 'Stubs can be reached via load service discovery' + restTemplate.getForObject('http://loanIssuance/name', String) == 'loanIssuance' + restTemplate.getForObject('http://someNameThatShouldMapFraudDetectionServer/name', String) == 'fraudDetectionServer' + } + // end::test[] + + @Configuration + @EnableAutoConfiguration(exclude = [RibbonZookeeperAutoConfiguration]) + @EnableDiscoveryClient + static class Config { + + @Bean + @LoadBalanced + RestTemplate restTemplate() { + return new RestTemplate() + } + } +}