From c9228969de898b0c4373877dcd56b73134b1f77b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Aug 2018 17:52:28 +0200 Subject: [PATCH] Closing and restarting WireMock stub after and before each test (#707) fixes gh-665 --- README.adoc | 2 - ...oanApplicationServiceContextPathTests.java | 2 - .../loan/LoanApplicationServiceTests.java | 2 - .../src/test/resources/application.yaml | 3 + .../loan/LoanApplicationServiceTests.java | 2 - .../com/example/loan/ServiceProperties.java | 17 +++++ ...oanApplicationServiceContextPathTests.java | 2 - .../loan/LoanApplicationServiceTests.java | 2 - .../WiremockForDocsClassRuleTests.java | 1 - ...mockForDocsMockServerApplicationTests.java | 1 - .../com/example/WiremockForDocsTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockImportApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockImportApplicationTests.java | 1 - ...mockImportContextPathApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockImportApplicationTests.java | 1 - .../WiremockMockServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - spring-cloud-contract-stub-runner/README.adoc | 8 -- spring-cloud-contract-stub-runner/pom.xml | 5 ++ .../stubrunner/StubRunnerExecutor.java | 5 ++ .../cloud/contract/stubrunner/StubServer.java | 26 +++++++ ...ubRunnerWireMockTestExecutionListener.java | 63 ++++++++++++++++ .../wiremock/WireMockHttpServerStub.java | 49 ++++++++++++- .../main/resources/META-INF/spring.factories | 6 +- .../spring/StubRunnerConfigurationSpec.groovy | 2 - ...nerSpringCloudAutoConfigurationSpec.groovy | 2 - .../StubRunnerStubsPerConsumerSpec.groovy | 2 - ...tubsPerConsumerWithConsumerNameSpec.groovy | 2 - ...ingCloudConsulAutoConfigurationSpec.groovy | 2 - .../wiremock/WireMockConfiguration.java | 31 +++++++- .../WireMockTestExecutionListener.java | 73 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 4 + ...AutoConfigureWireMockApplicationTests.java | 5 +- ...gureWireMockAutoStubsApplicationTests.java | 1 - ...eWireMockConfigurationCustomizerTests.java | 1 - ...onfigureWireMockFilesApplicationTests.java | 1 - ...MockFilesApplicationWithoutSlashTests.java | 1 - ...gureWireMockHttpsPortApplicationTests.java | 1 - ...ConfigureWireMockPortApplicationTests.java | 1 - ...ureWireMockRandomPortApplicationTests.java | 16 ++-- ...reMockRandomPortHttpsApplicationTests.java | 1 - ...igureWireMockSamePortApplicationTests.java | 33 +++++++++ ...WireMockStubsAndFilesApplicationTests.java | 1 - ...StubsAndMultipleFilesApplicationTests.java | 1 - ...onfigureWireMockStubsApplicationTests.java | 1 - ...ireMockStubsApplicationWithSlashTests.java | 1 - .../WiremockHttpsServerApplicationTests.java | 1 - .../WiremockServerApplicationTests.java | 1 - ...iremockServerRestDocsApplicationTests.java | 1 - ...ServerRestDocsMatcherApplicationTests.java | 1 - .../wiremock/WiremockTestsApplication.java | 6 +- .../src/test/resources/application.yml | 3 + .../CamelMessagingApplicationSpec.groovy | 2 - ...IntegrationMessagingApplicationSpec.groovy | 4 +- .../com/example/SpringApplicationSpec.groovy | 6 +- .../StreamMessagingApplicationSpec.groovy | 2 - ...ingCloudEurekaAutoConfigurationSpec.groovy | 2 - ...CloudZookeeperAutoConfigurationSpec.groovy | 2 - .../loan/LoanApplicationServiceTests.java | 2 - .../moco/MocoHttpServerStubSpec.groovy | 2 - 68 files changed, 330 insertions(+), 99 deletions(-) create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java create mode 100644 spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java create mode 100644 spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java create mode 100644 spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java create mode 100644 spring-cloud-contract-wiremock/src/test/resources/application.yml diff --git a/README.adoc b/README.adoc index c3a2fc1339..bbd2e8da12 100644 --- a/README.adoc +++ b/README.adoc @@ -272,7 +272,6 @@ Annotate your test class with `@AutoConfigureStubRunner`. In the annotation prov @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { ---- @@ -758,7 +757,6 @@ can also provide the offline work switch. @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { ---- diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java index 4aa608011d..b2cd987551 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -19,7 +18,6 @@ import com.example.loan.model.LoanApplicationStatus; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE, properties="server.context-path=/app") @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceContextPathTests { @Autowired diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 2daa188acc..82672baaa3 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -10,7 +10,6 @@ import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -27,7 +26,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { // end::autoconfigure_stubrunner[] diff --git a/samples/standalone/dsl/http-client/src/test/resources/application.yaml b/samples/standalone/dsl/http-client/src/test/resources/application.yaml index 21459f2953..fcdfd10d16 100644 --- a/samples/standalone/dsl/http-client/src/test/resources/application.yaml +++ b/samples/standalone/dsl/http-client/src/test/resources/application.yaml @@ -1,2 +1,5 @@ server: port: 6565 +logging: + level: + org.springframework.cloud.contract: debug \ No newline at end of file diff --git a/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 9877692b94..7ccd8e164e 100644 --- a/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -10,7 +10,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; import org.springframework.core.env.Environment; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -21,7 +20,6 @@ import com.example.loan.model.LoanApplicationStatus; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:pact-http-server:+:stubs"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { @Autowired diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java new file mode 100644 index 0000000000..0dff3bd2da --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/ServiceProperties.java @@ -0,0 +1,17 @@ +package com.example.loan; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("service") +public class ServiceProperties { + + private int port = 8080; + + public void setPort(int port) { + this.port = port; + } + + public int getPort() { + return this.port; + } +} diff --git a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java index f8351eb14a..fd282ad322 100644 --- a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java +++ b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceContextPathTests.java @@ -8,7 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -19,7 +18,6 @@ import com.example.loan.model.LoanApplicationStatus; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE, properties="server.context-path=/app") @AutoConfigureStubRunner(ids = {"com.example:http-server-yml:+:stubs:6569"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceContextPathTests { @Autowired diff --git a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index f4a9c0672d..e44e4f32fa 100644 --- a/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/yml/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.example.loan.model.Client; @@ -20,7 +19,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @AutoConfigureStubRunner(ids = {"com.example:http-server-yml:+:stubs:6569"}, workOffline = true) -@DirtiesContext public class LoanApplicationServiceTests { // end::autoconfigure_stubrunner[] diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java index 94aff4b974..8633d32cdb 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsClassRuleTests.java @@ -20,7 +20,6 @@ import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @ActiveProfiles("classrule") -@DirtiesContext //tag::wiremock_test1[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java index 8bbcec20ff..b46bfc3c80 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsMockServerApplicationTests.java @@ -13,7 +13,6 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; -@DirtiesContext // tag::wiremock_test[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.NONE) diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java index 80ee38dd34..fda739e6e9 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockForDocsTests.java @@ -19,7 +19,6 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("docs") -@DirtiesContext //tag::wiremock_test1[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 93b83c12d5..8e3fc669a5 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -21,7 +21,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest("app.baseUrl=https://localhost:8443") -@DirtiesContext @AutoConfigureHttpClient public class WiremockHttpsServerApplicationTests { diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java index 121f8e2d50..761c7344c6 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockImportApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6060", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 6060) public class WiremockImportApplicationTests { diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java index 6044625d39..ac7d44c007 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -15,7 +15,6 @@ import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockMockServerApplicationTests { @Autowired diff --git a/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java index 9bbb1671d6..cdb6c9e950 100644 --- a/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-jetty/src/test/java/com/example/WiremockServerApplicationTests.java @@ -28,7 +28,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6061", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java index faef1e5ff2..6c532787db 100644 --- a/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-native/src/test/java/com/example/WiremockServerApplicationTests.java @@ -19,7 +19,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6063", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 9e30002fdf..05e370b069 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -21,7 +21,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest("app.baseUrl=https://localhost:6443") -@DirtiesContext @AutoConfigureHttpClient public class WiremockHttpsServerApplicationTests { diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java index 7169d26908..1b4f3916ef 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6065", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 6065) public class WiremockImportApplicationTests { diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java index c46ffe2873..dc091a4653 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockImportContextPathApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties = { "app.baseUrl=http://localhost:6066", "server.context-path=/app" }, webEnvironment = WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 6066) public class WiremockImportContextPathApplicationTests { diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java index bf75089652..ec44e4a947 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -15,7 +15,6 @@ import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockMockServerApplicationTests { @Autowired diff --git a/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java index d4c5656527..b47123d10e 100644 --- a/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-tomcat/src/test/java/com/example/WiremockServerApplicationTests.java @@ -29,7 +29,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:6067", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java b/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java index 4bd913d950..4fe5fe2426 100644 --- a/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java +++ b/samples/wiremock-undertow-ssl/src/test/java/com/example/WiremockHttpsServerApplicationTests.java @@ -22,7 +22,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest("app.baseUrl=https://localhost:7443") -@DirtiesContext @ActiveProfiles("ssl") public class WiremockHttpsServerApplicationTests { diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java index fd6c29e060..12440cbce8 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockImportApplicationTests.java @@ -18,7 +18,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:7070", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 7070) public class WiremockImportApplicationTests { diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java index f53438fc5a..ae6055a12b 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockMockServerApplicationTests.java @@ -15,7 +15,6 @@ import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockMockServerApplicationTests { @Autowired diff --git a/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java b/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java index 9fd429e5b1..1dc0c5d538 100644 --- a/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java +++ b/samples/wiremock-undertow/src/test/java/com/example/WiremockServerApplicationTests.java @@ -20,7 +20,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest(properties="app.baseUrl=http://localhost:7071", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/spring-cloud-contract-stub-runner/README.adoc b/spring-cloud-contract-stub-runner/README.adoc index 64a10cb65c..28fb0d2527 100644 --- a/spring-cloud-contract-stub-runner/README.adoc +++ b/spring-cloud-contract-stub-runner/README.adoc @@ -146,14 +146,6 @@ HTTP stubs without the need to download artifacts. ==== Running stubs -===== Limitations - -IMPORTANT: There might be a problem with StubRunner shutting down ports between tests. You might - have a situation in which you get port conflicts. As long as you use the same context across tests - everything works fine. But when the context are different (e.g. different stubs or different profiles) - then you have to either use `@DirtiesContext` to shut down the stub servers, or else run them on - different ports per test. - ===== Running using main app You can set the following options to the main class: diff --git a/spring-cloud-contract-stub-runner/pom.xml b/spring-cloud-contract-stub-runner/pom.xml index fddcf60092..e33657f528 100644 --- a/spring-cloud-contract-stub-runner/pom.xml +++ b/spring-cloud-contract-stub-runner/pom.xml @@ -75,6 +75,11 @@ spring-integration-java-dsl true + + org.springframework + spring-test + true + org.springframework.boot spring-boot-autoconfigure-processor diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java index 551076cf13..80825968fe 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import groovy.json.JsonOutput; import org.slf4j.Logger; @@ -38,12 +39,15 @@ import org.springframework.cloud.contract.stubrunner.provider.wiremock.WireMockH import org.springframework.cloud.contract.verifier.messaging.MessageVerifier; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpStubMessages; import org.springframework.cloud.contract.verifier.util.BodyExtractor; +import wiremock.org.eclipse.jetty.util.ConcurrentHashSet; /** * Runs stubs for a particular {@link StubServer} */ class StubRunnerExecutor implements StubFinder { + static final Set STUB_SERVERS = new ConcurrentHashSet<>(); + private static final Logger log = LoggerFactory.getLogger(StubRunnerExecutor.class); private final AvailablePortScanner portScanner; private final MessageVerifier contractVerifierMessaging; @@ -261,6 +265,7 @@ class StubRunnerExecutor implements StubFinder { } }); } + STUB_SERVERS.add(this.stubServer); } private boolean hasRequest(Collection contracts) { diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java index 73c7ded42f..429edb6ac3 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubServer.java @@ -20,6 +20,7 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +60,14 @@ class StubServer { return this; } + public boolean isRunning() { + return this.httpServerStub.isRunning(); + } + public void stop() { + if (log.isDebugEnabled()) { + log.debug("Stopping the server at port [" + this.getPort() + "]"); + } this.httpServerStub.stop(); } @@ -95,4 +103,22 @@ class StubServer { return this.httpServerStub.registeredMappings(); } + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + StubServer that = (StubServer) o; + return Objects.equals(this.stubConfiguration, that.stubConfiguration) && Objects + .equals(this.contracts, that.contracts); + } + + @Override public int hashCode() { + return Objects.hash(this.stubConfiguration, this.contracts); + } + + @Override public String toString() { + return "StubServer{" + "stubConfiguration=" + this.stubConfiguration + ", mappingsSize=" + + this.mappings.size() + '}'; + } } diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java new file mode 100644 index 0000000000..b29e451bf7 --- /dev/null +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/StubRunnerWireMockTestExecutionListener.java @@ -0,0 +1,63 @@ +package org.springframework.cloud.contract.stubrunner.provider.wiremock; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.github.tomakehurst.wiremock.stubbing.StubMapping; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.contract.stubrunner.HttpServerStub; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.support.AbstractTestExecutionListener; +import org.springframework.util.Assert; +import org.springframework.web.client.RestTemplate; + +/** + * Stops the {@link HttpServerStub} after each test class + * + * @author Marcin Grzejszczak + * @since 1.2.6 + */ +public final class StubRunnerWireMockTestExecutionListener extends AbstractTestExecutionListener { + + private static final Log log = LogFactory.getLog(StubRunnerWireMockTestExecutionListener.class); + + private static Map> STUBS = new ConcurrentHashMap<>(); + + @Override public void beforeTestClass(TestContext testContext) { + Map stubs = STUBS + .get(testContext.getApplicationContext()); + if (stubs != null) { + if (log.isDebugEnabled()) { + log.debug("Found a matching application context from [" + testContext.getTestClass().getName() + "]"); + } + for (Map.Entry entry : stubs.entrySet()) { + while (entry.getKey().isRunning()) { + entry.getKey().stop(); + } + List mappings = entry.getValue().mappings; + if (log.isDebugEnabled()) { + log.debug("Stopped a running WireMock instance at " + + "port [" + entry.getValue().port + "] with stub mappings " + + "size [" + mappings.size() + "]. Restarting the stub."); + } + entry.getKey().start(entry.getValue().port); + entry.getKey().registerDescriptors(mappings); + Assert.isTrue(new RestTemplate().getForEntity("http://localhost:" + entry.getValue().port + "/__admin/mappings", String.class) + .getStatusCode().is2xxSuccessful(), "__admin/mappings endpoint wasn't accessible"); + } + } + } + + @Override public void afterTestClass(TestContext testContext) { + STUBS.put(testContext.getApplicationContext(), WireMockHttpServerStub.SERVERS); + if (log.isDebugEnabled()) { + log.debug("Stopping servers " + WireMockHttpServerStub.SERVERS); + } + for (HttpServerStub serverStub : WireMockHttpServerStub.SERVERS.keySet()) { + serverStub.stop(); + } + } +} \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java index 7146153c20..4f01fbab44 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; @@ -43,6 +44,8 @@ public class WireMockHttpServerStub implements HttpServerStub { private static final Logger log = LoggerFactory.getLogger(WireMockHttpServerStub.class); private static final int INVALID_PORT = -1; + static final Map SERVERS = new ConcurrentHashMap<>(); + private WireMockServer wireMockServer; private WireMockConfiguration config() { @@ -107,6 +110,12 @@ public class WireMockHttpServerStub implements HttpServerStub { this.wireMockServer = new WireMockServer(config().port(port) .notifier(new Slf4jNotifier(true))); this.wireMockServer.start(); + if (log.isDebugEnabled()) { + log.debug("Started WireMock at port [" + port + "]"); + } + if (!SERVERS.containsKey(this)) { + SERVERS.put(this, new PortAndMappings(port, new ArrayList())); + } return this; } @@ -159,20 +168,25 @@ public class WireMockHttpServerStub implements HttpServerStub { } private void registerStubMappings(Collection stubFiles) { - WireMock wireMock = new WireMock("localhost", port(), ""); + WireMock wireMock = wireMock(); registerDefaultHealthChecks(wireMock); registerStubs(stubFiles, wireMock); } + private WireMock wireMock() { + return new WireMock("localhost", port(), ""); + } + private void registerDefaultHealthChecks(WireMock wireMock) { registerHealthCheck(wireMock, "/ping"); registerHealthCheck(wireMock, "/health"); } private void registerStubs(Collection sortedMappings, WireMock wireMock) { + List stubMappings = new ArrayList<>(); for (File mappingDescriptor : sortedMappings) { try { - wireMock.register(getMapping(mappingDescriptor)); + stubMappings.add(registerDescriptor(wireMock, mappingDescriptor)); if (log.isDebugEnabled()) { log.debug("Registered stub mappings from [" + mappingDescriptor + "]"); } @@ -183,6 +197,23 @@ public class WireMockHttpServerStub implements HttpServerStub { } } } + PortAndMappings portAndMappings = SERVERS.get(this); + SERVERS.put(this, new PortAndMappings(portAndMappings.port, stubMappings)); + } + + private StubMapping registerDescriptor(WireMock wireMock, File mappingDescriptor) { + StubMapping mapping = getMapping(mappingDescriptor); + wireMock.register(mapping); + return mapping; + } + + void registerDescriptors(List stubMappings) { + if (log.isDebugEnabled()) { + log.debug("Registering stub mappings size [" + stubMappings.size() + "] at port [" + port() + "]"); + } + for (StubMapping mapping : stubMappings) { + wireMock().register(mapping); + } } private void registerHealthCheck(WireMock wireMock, String url) { @@ -194,3 +225,17 @@ public class WireMockHttpServerStub implements HttpServerStub { WireMock.get(WireMock.urlEqualTo(url)).willReturn(WireMock.aResponse().withBody(body).withStatus(200))); } } + +class PortAndMappings { + final Integer port; + final List mappings; + + PortAndMappings(Integer port, List mappings) { + this.port = port; + this.mappings = mappings; + } + + @Override public String toString() { + return "PortAndMappings{" + "port=" + this.port + ", mappings=" + this.mappings.size() + '}'; + } +} \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories index dc3d4e026a..086dbdce76 100644 --- a/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories @@ -8,4 +8,8 @@ org.springframework.cloud.contract.stubrunner.messaging.integration.StubRunnerIn org.springframework.cloud.contract.stubrunner.messaging.camel.StubRunnerCamelConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.zookeeper.StubRunnerSpringCloudZookeeperAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.eureka.StubRunnerSpringCloudEurekaAutoConfiguration,\ -org.springframework.cloud.contract.stubrunner.spring.cloud.consul.StubRunnerSpringCloudConsulAutoConfiguration \ No newline at end of file +org.springframework.cloud.contract.stubrunner.spring.cloud.consul.StubRunnerSpringCloudConsulAutoConfiguration +# +## Test Execution Listeners +org.springframework.test.context.TestExecutionListener=\ +org.springframework.cloud.contract.stubrunner.provider.wiremock.StubRunnerWireMockTestExecutionListener \ No newline at end of file diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy index 4dad71a21e..914959ecdd 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfigurationSpec.groovy @@ -27,7 +27,6 @@ import org.springframework.cloud.contract.stubrunner.StubFinder import org.springframework.cloud.contract.stubrunner.StubNotFoundException import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -42,7 +41,6 @@ import spock.lang.Specification "stubrunner.camel.enabled=false", 'foo=${stubrunner.runningstubs.fraudDetectionServer.port}']) @AutoConfigureStubRunner(mappingsOutputFolder = "target/outputmappings/") -@DirtiesContext @ActiveProfiles("test") class StubRunnerConfigurationSpec extends Specification { 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 100e48e3e8..0c2fd35133 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 @@ -30,7 +30,6 @@ import org.springframework.cloud.zookeeper.ZookeeperAutoConfiguration 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.ActiveProfiles import org.springframework.test.context.ContextConfiguration import org.springframework.web.client.RestTemplate @@ -48,7 +47,6 @@ import spock.lang.Specification "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") // end::autoconfigure[] -@DirtiesContext class StubRunnerSpringCloudAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy index c51b1496d8..7c8dbdd169 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerSpec.groovy @@ -30,7 +30,6 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment import org.springframework.http.ResponseEntity import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -43,7 +42,6 @@ import spock.lang.Specification @AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers", repositoryRoot = "classpath:m2repo/repository/", stubsPerConsumer = true) -@DirtiesContext class StubRunnerStubsPerConsumerSpec extends Specification { // end::test[] diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy index 8e451ff9e6..f8487d95f2 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerStubsPerConsumerWithConsumerNameSpec.groovy @@ -30,7 +30,6 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.env.Environment import org.springframework.http.ResponseEntity import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -44,7 +43,6 @@ import spock.lang.Specification repositoryRoot = "classpath:m2repo/repository/", consumerName = "foo-consumer", stubsPerConsumer = true) -@DirtiesContext class StubRunnerStubsPerConsumerWithConsumerNameSpec extends Specification { // end::test[] diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy index 236e96080c..36f1d8998a 100644 --- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/consul/StubRunnerSpringCloudConsulAutoConfigurationSpec.groovy @@ -31,7 +31,6 @@ import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner 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 spock.lang.Specification @@ -57,7 +56,6 @@ import static org.mockito.Mockito.mock "org.springframework.cloud.contract.verifier.stubs:fraudDetectionServer", "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") -@DirtiesContext class StubRunnerSpringCloudConsulAutoConfigurationSpec extends Specification { @Autowired ConsulClient client diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java index cbc51c365c..457f058634 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java @@ -23,6 +23,8 @@ import java.util.List; import javax.annotation.PostConstruct; import com.github.tomakehurst.wiremock.common.Slf4jNotifier; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -33,12 +35,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.util.Assert; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.core.Options; +import org.springframework.web.client.RestTemplate; /** * Configuration and lifecycle for a Spring Application context that wants to run a @@ -55,6 +59,10 @@ import com.github.tomakehurst.wiremock.core.Options; @EnableConfigurationProperties(WireMockProperties.class) public class WireMockConfiguration implements SmartLifecycle { + private static final Log log = LogFactory.getLog(WireMockConfiguration.class); + + static final String WIREMOCK_SERVER_BEAN_NAME = "wireMockServer"; + private volatile boolean running; private WireMockServer server; @@ -91,10 +99,15 @@ public class WireMockConfiguration implements SmartLifecycle { this.customizer.customize(factory); } } - this.server = new WireMockServer(this.options); + if (this.server == null) { + this.server = new WireMockServer(this.options); + } registerStubs(); - if (!this.beanFactory.containsBean("wireMockServer")) { - this.beanFactory.registerSingleton("wireMockServer", this.server); + if (log.isDebugEnabled()) { + log.debug("WireMock server has [" + this.server.getStubMappings().size() + "] registered"); + } + if (!this.beanFactory.containsBean(WIREMOCK_SERVER_BEAN_NAME)) { + this.beanFactory.registerSingleton(WIREMOCK_SERVER_BEAN_NAME, this.server); } } @@ -118,6 +131,10 @@ public class WireMockConfiguration implements SmartLifecycle { } } + void reset() { + this.server.resetAll(); + } + private void registerFiles(com.github.tomakehurst.wiremock.core.WireMockConfiguration factory) throws IOException { List resources = new ArrayList<>(); for (String files : this.wireMock.getFiles()) { @@ -142,6 +159,11 @@ public class WireMockConfiguration implements SmartLifecycle { this.server.start(); WireMock.configureFor("localhost", this.server.port()); this.running = true; + if (log.isDebugEnabled()) { + log.debug("Started WireMock at port [" + this.server.port() + "]. It has [" + this.server.getStubMappings().size() + "] mappings registered"); + } + Assert.isTrue(new RestTemplate().getForEntity("http://localhost:" + this.server.port() + "/__admin/mappings", String.class) + .getStatusCode().is2xxSuccessful(), "__admin/mappings endpoint wasn't accessible"); } @Override @@ -149,6 +171,9 @@ public class WireMockConfiguration implements SmartLifecycle { if (this.running) { this.server.stop(); this.running = false; + if (log.isDebugEnabled()) { + log.debug("Stopped WireMock instance"); + } } } diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java new file mode 100644 index 0000000000..77947f65bf --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockTestExecutionListener.java @@ -0,0 +1,73 @@ +package org.springframework.cloud.contract.wiremock; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.support.AbstractTestExecutionListener; + +/** + * Stops the WireMock server after each test class and restarts it before every class + * + * @author Marcin Grzejszczak + * @since 1.2.6 + */ +public final class WireMockTestExecutionListener extends AbstractTestExecutionListener { + + private static final Log log = LogFactory.getLog(WireMockTestExecutionListener.class); + + @Override public void beforeTestClass(TestContext testContext) { + try { + if (wireMockConfigMissing(testContext)) { + return; + } + WireMockConfiguration wireMockConfiguration = wireMockConfiguration(testContext); + if (log.isDebugEnabled()) { + log.debug("WireMock configuration is running [" + wireMockConfiguration.isRunning() + "]"); + } + if (!wireMockConfiguration.isRunning()) { + wireMockConfiguration.reset(); + wireMockConfiguration.init(); + wireMockConfiguration.start(); + } + } catch (Exception e) { + if (log.isDebugEnabled()) { + log.debug("Exception occurred while trying to init WireMock configuration", e); + } + } + } + + private boolean wireMockConfigMissing(TestContext testContext) { + boolean missing = !testContext.getApplicationContext().containsBean(WireMockConfiguration.class.getName()); + if (log.isDebugEnabled()) { + log.debug("WireMockConfig is missing [" + missing + "]"); + } + return missing; + } + + @Override public void afterTestClass(TestContext testContext) { + try { + if (wireMockConfigMissing(testContext)) { + return; + } + stopWireMockConfiguration(testContext); + } catch (Exception e) { + if (log.isDebugEnabled()) { + log.debug("Exception occurred while trying to init WireMock configuration", e); + } + } + } + + private void stopWireMockConfiguration(TestContext testContext) { + WireMockConfiguration wireMockConfiguration = wireMockConfiguration(testContext); + if (wireMockConfiguration.isRunning()) { + if (log.isDebugEnabled()) { + log.debug("WireMock is running, will stop it"); + } + wireMockConfiguration.stop(); + } + } + + private WireMockConfiguration wireMockConfiguration(TestContext testContext) { + return testContext.getApplicationContext().getBean(WireMockConfiguration.class); + } +} diff --git a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories index 9ac5aa6677..2f458f9e92 100644 --- a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories @@ -5,3 +5,7 @@ org.springframework.cloud.contract.wiremock.WireMockApplicationListener # RestDocs Auto Configuration org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs=\ org.springframework.cloud.contract.wiremock.restdocs.WireMockRestDocsConfiguration + +# Test Execution Listeners +org.springframework.test.context.TestExecutionListener=\ +org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener \ No newline at end of file diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java index b7df3fdf09..e884b39ab9 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockApplicationTests.java @@ -6,6 +6,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; +import com.github.tomakehurst.wiremock.WireMockServer; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,11 +14,11 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext -@AutoConfigureWireMock(port = 5432) +@AutoConfigureWireMock(port = 12345) public class AutoConfigureWireMockApplicationTests { @Autowired diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java index ad0b1200d1..8007b897ef 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockAutoStubsApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0) // Default stubs work at classpath:/mappings public class AutoConfigureWireMockAutoStubsApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java index b79c65f012..1ab19f1d8a 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java @@ -18,7 +18,6 @@ import static org.assertj.core.api.Assertions.assertThat; AutoConfigureWireMockConfigurationCustomizerTests.Config.class}, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockConfigurationCustomizerTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java index 0ef3869b08..c3fea3d63a 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files="classpath:/root/") public class AutoConfigureWireMockFilesApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java index c1508f1d77..6f3f662a04 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockFilesApplicationWithoutSlashTests.java @@ -12,7 +12,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files="classpath:root") public class AutoConfigureWireMockFilesApplicationWithoutSlashTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java index de9f4e4ec2..d365408fa2 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockHttpsPortApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=https://localhost:${wiremock.server.https-port}", webEnvironment = WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(httpsPort = 9999, port=0) public class AutoConfigureWireMockHttpsPortApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java index 63e49e3d2b..6c0282faba 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockPortApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment = WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port = 9999) public class AutoConfigureWireMockPortApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java index aa0dbde681..dd45cc315f 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortApplicationTests.java @@ -1,22 +1,20 @@ package org.springframework.cloud.contract.wiremock; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringRunner; + import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; - @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0) public class AutoConfigureWireMockRandomPortApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java index c36d7e1996..97eb739c5e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockRandomPortHttpsApplicationTests.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=https://localhost:${wiremock.server.https-port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, httpsPort=0) public class AutoConfigureWireMockRandomPortHttpsApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java new file mode 100644 index 0000000000..19add19d03 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockSamePortApplicationTests.java @@ -0,0 +1,33 @@ +package org.springframework.cloud.contract.wiremock; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = WiremockTestsApplication.class, properties = "app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment = WebEnvironment.NONE) +@AutoConfigureWireMock(port = 9999) +// Should manage to register +public class AutoConfigureWireMockSamePortApplicationTests { + + @Autowired + private Service service; + + @Test + public void contextLoads() throws Exception { + stubFor(get(urlEqualTo("/test2")).willReturn(aResponse() + .withHeader("Content-Type", "text/plain").withBody("Hello World2!"))); + assertThat(this.service.go2()).isEqualTo("Hello World2!"); + } + +} diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java index 28f96987ab..cba4c7de6f 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndFilesApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files="classpath:/root/", stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsAndFilesApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java index 79a0ad2314..02389a3fbe 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, files={"classpath:/", "classpath:/root/", "classpath:/nonexistent/"}, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsAndMultipleFilesApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java index c286aec9be..1d7039f02e 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationTests.java @@ -12,7 +12,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsApplicationTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java index cd24d33aa0..8f565d2f22 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsApplicationWithSlashTests.java @@ -12,7 +12,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) -@DirtiesContext @AutoConfigureWireMock(port=0, stubs="file:src/test/resources/io.stubs/mappings/") public class AutoConfigureWireMockStubsApplicationWithSlashTests { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java index 15d73ade30..05ecaa821b 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockHttpsServerApplicationTests.java @@ -18,7 +18,6 @@ import com.github.tomakehurst.wiremock.junit.WireMockClassRule; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=https://localhost:8443") -@DirtiesContext public class WiremockHttpsServerApplicationTests { @ClassRule diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java index 062a7e9012..5a3da0fbbb 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerApplicationTests.java @@ -20,7 +20,6 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:5435", webEnvironment=WebEnvironment.NONE) -@DirtiesContext public class WiremockServerApplicationTests { @ClassRule diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java index 78d0256327..719076c4a1 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java @@ -27,7 +27,6 @@ import wiremock.org.eclipse.jetty.http.HttpStatus; @SpringBootTest(classes = TestConfiguration.class) @AutoConfigureRestDocs(outputDir = "target/snippets") @AutoConfigureMockMvc -@DirtiesContext public class WiremockServerRestDocsApplicationTests { @Autowired private MockMvc mockMvc; diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java index 3017ce6dc6..67aa1252aa 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsMatcherApplicationTests.java @@ -30,7 +30,6 @@ import com.github.tomakehurst.wiremock.client.WireMock; @SpringBootTest(classes = TestConfiguration.class) @AutoConfigureRestDocs(outputDir = "target/snippets") @AutoConfigureMockMvc -@DirtiesContext public class WiremockServerRestDocsMatcherApplicationTests { @Autowired diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java index df1a184074..a9fd7f55c2 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java @@ -46,7 +46,7 @@ class Controller { class Service { @Value("${app.baseUrl:http://example.org}") - private String base; + String base; private RestTemplate restTemplate; @@ -58,6 +58,10 @@ class Service { return this.restTemplate.getForEntity(this.base + "/test", String.class).getBody(); } + public String go2() { + return this.restTemplate.getForEntity(this.base + "/test2", String.class).getBody(); + } + public void setBase(String base) { this.base = base; } diff --git a/spring-cloud-contract-wiremock/src/test/resources/application.yml b/spring-cloud-contract-wiremock/src/test/resources/application.yml new file mode 100644 index 0000000000..95382003b1 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/resources/application.yml @@ -0,0 +1,3 @@ +logging: + level: + org.springframework.cloud.contract: debug \ No newline at end of file diff --git a/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy b/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy index 2d43631044..2785036d98 100644 --- a/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy @@ -27,7 +27,6 @@ import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -41,7 +40,6 @@ import com.toomuchcoding.jsonassert.JsonAssertion */ // Context configuration would end up in base class @ContextConfiguration(classes = [CamelMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @AutoConfigureMessageVerifier class CamelMessagingApplicationSpec extends Specification { diff --git a/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy b/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy index a50b850083..b3a5ec34e3 100644 --- a/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy @@ -25,7 +25,6 @@ import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -35,9 +34,8 @@ import com.jayway.jsonpath.JsonPath import com.toomuchcoding.jsonassert.JsonAssertion // Context configuration would end up in base class @ContextConfiguration(classes = [IntegrationMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @AutoConfigureMessageVerifier -public class IntegrationMessagingApplicationSpec extends Specification { +class IntegrationMessagingApplicationSpec extends Specification { // ALL CASES @Inject MessageVerifier> contractVerifierMessaging diff --git a/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy b/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy index fcb16bc994..402fd0e8dd 100644 --- a/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy +++ b/tests/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy @@ -25,8 +25,7 @@ import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; -import org.springframework.messaging.Message; -import org.springframework.test.annotation.DirtiesContext +import org.springframework.messaging.Message import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -40,9 +39,8 @@ import com.toomuchcoding.jsonassert.JsonAssertion */ // Context configuration would end up in base class @ContextConfiguration(classes = [SpringMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @AutoConfigureMessageVerifier -public class SpringApplicationSpec extends Specification { +class SpringApplicationSpec extends Specification { // ALL CASES @Inject MessageVerifier> contractVerifierMessaging diff --git a/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy b/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy index abcf7f3a9b..ca305ee7ee 100644 --- a/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy +++ b/tests/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy @@ -27,7 +27,6 @@ import org.springframework.cloud.contract.verifier.messaging.MessageVerifier import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper import org.springframework.messaging.Message -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -37,7 +36,6 @@ import javax.inject.Inject */ // Context configuration would end up in base class @ContextConfiguration(classes = [StreamMessagingApplication], loader = SpringBootContextLoader) -@DirtiesContext @SpringBootTest(properties = "debug=true") @AutoConfigureMessageVerifier class StreamMessagingApplicationSpec extends Specification { diff --git a/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy b/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy index 6d44662c31..386831ffdc 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-boot-eureka/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfigurationSpec.groovy @@ -31,7 +31,6 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.HttpMethod import org.springframework.http.client.ClientHttpResponse -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import org.springframework.web.client.* import spock.lang.AutoCleanup @@ -56,7 +55,6 @@ import spock.util.concurrent.PollingConditions "org.springframework.cloud.contract.verifier.stubs:fraudDetectionServer", "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") -@DirtiesContext class StubRunnerSpringCloudEurekaAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy index d68ebd4a8f..64551dbefa 100644 --- a/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-boot-zookeeper/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/zookeeper/StubRunnerSpringCloudZookeeperAutoConfigurationSpec.groovy @@ -31,7 +31,6 @@ import org.springframework.cloud.zookeeper.ZookeeperProperties import org.springframework.cloud.zookeeper.discovery.ZookeeperServiceDiscovery 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.util.SocketUtils import org.springframework.web.client.RestTemplate @@ -50,7 +49,6 @@ import spock.lang.Specification "org.springframework.cloud.contract.verifier.stubs:fraudDetectionServer", "org.springframework.cloud.contract.verifier.stubs:bootService"], repositoryRoot = "classpath:m2repo/repository/") -@DirtiesContext class StubRunnerSpringCloudZookeeperAutoConfigurationSpec extends Specification { @Autowired StubFinder stubFinder diff --git a/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 5910bd9dcd..4e3b3597c9 100644 --- a/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/tests/spring-cloud-contract-stub-runner-context-path/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -9,7 +9,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.cloud.contract.stubrunner.StubFinder; import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; @@ -25,7 +24,6 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) @AutoConfigureStubRunner(repositoryRoot = "classpath:m2repo/repository/", ids = { "org.springframework.cloud.contract.verifier.stubs:contextPathFraudDetectionServer" }) -@DirtiesContext public class LoanApplicationServiceTests { // end::autoconfigure_stubrunner[] diff --git a/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy b/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy index 5cbf274f11..24cab08b46 100644 --- a/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy +++ b/tests/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStubSpec.groovy @@ -28,7 +28,6 @@ import org.springframework.cloud.stream.messaging.Sink import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.stereotype.Component -import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -43,7 +42,6 @@ import spock.lang.Specification // @AutoConfigureStubRunner @AutoConfigureStubRunner( ids = ["com.example:fraudDetectionServerMoco"]) // end::[classpath_stub_runner] -@DirtiesContext @ActiveProfiles("test") class MocoHttpServerStubSpec extends Specification {