From 66dad3918889a73114b735acd2ac34af1d7baf36 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 8 May 2017 12:42:32 +0200 Subject: [PATCH] Fix spring cloud contract test to use a defined stub version Rather than attempting to retrieve the latest version of the stubs, this commit makes sure the test uses the same version as the one of the project. This fixes gh-422 in a different way --- initializr-docs/pom.xml | 9 ++ .../src/main/asciidoc/using-the-stubs.adoc | 97 ++++++++----------- ...Tests.java => ClientApplicationTests.java} | 6 +- 3 files changed, 51 insertions(+), 61 deletions(-) rename initializr-docs/src/test/java/io/spring/initializr/stub/{InitializrIntegrationTests.java => ClientApplicationTests.java} (95%) diff --git a/initializr-docs/pom.xml b/initializr-docs/pom.xml index 37a4de90..741a4074 100644 --- a/initializr-docs/pom.xml +++ b/initializr-docs/pom.xml @@ -53,6 +53,15 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.version} + + + diff --git a/initializr-docs/src/main/asciidoc/using-the-stubs.adoc b/initializr-docs/src/main/asciidoc/using-the-stubs.adoc index f0318e91..099e93bc 100644 --- a/initializr-docs/src/main/asciidoc/using-the-stubs.adoc +++ b/initializr-docs/src/main/asciidoc/using-the-stubs.adoc @@ -6,7 +6,7 @@ service, you can use these stubs to test your own code. You can consume them wit raw Wiremock APIs, or via some features of https://github.com/spring-cloud/spring-cloud-contract[Spring Cloud Contract]. -WireMock is an embedded web server that analyses incoming requests and chooses stub +TIP: WireMock is an embedded web server that analyses incoming requests and chooses stub responses based on matching some rules (e.g. a specific header value). So if you send it a request which matches one of its stubs, it will send you a response as if it was a real Initializr service, and you can use that to do full stack integration testing @@ -16,18 +16,17 @@ of your client. == Using WireMock with Spring Boot === Loading Stubs from the Classpath - A convenient way to consume the stubs in your project is to add a test dependency: [source,xml,indent=0,subs="attributes,specialchars"] ---- - - io.spring.initializr - initializr-web - stubs - {project-version} - test - + + io.spring.initializr + initializr-web + stubs + {project-version} + test + ---- and then pull the stubs from the classpath. In a Spring Boot application, using @@ -37,7 +36,7 @@ with it like this: [source,java,subs="attributes"] ---- @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(webEnvironment = WebEnvironment.NONE) @AutoConfigureWireMock(port = 0, stubs="classpath:META-INF/io.spring.initializr/initializr-web/{spring-initializr-version}") public class ClientApplicationTests { @@ -50,37 +49,26 @@ public class ClientApplicationTests { } ---- -The wiremock fetaures come with Spring Cloud Contract Wiremock: +The Wiremock features come with Spring Cloud Contract Wiremock: -[source,xml,indent=0,subs="attributes,specialchars"] +[source,xml,indent=0] ---- - - ... - - org.springframework.cloud - spring-cloud-starter-contract-wiremock - test - - - - - - org.springframework.cloud - spring-cloud-contract-dependencies - 1.0.3.RELEASE - pom - import - - - + + org.springframework.cloud + spring-cloud-starter-contract-wiremock + test + ---- +TIP: This dependency is managed by the `spring-cloud-contract-dependencies` BOM. + + + === Using the Stub Runner - Alternatively you can configure the stub runner to look for the artifact, using a different Spring Cloud Contract dependency: `spring-cloud-starter-contract-stub-runner`. The example below will automatically -download, if necessary, the latest version of the initializr stubs (so you don't need the +download, if necessary, the defined version of the initializr stubs (so you don't need the stubs declared as a dependency): [source,xml,indent=0,subs="attributes,specialchars"] @@ -93,40 +81,33 @@ stubs declared as a dependency): test - - - - org.springframework.cloud - spring-cloud-contract-dependencies - 1.0.3.RELEASE - pom - import - - - ---- +The test should use `@AutoConfigureStubRunner` instead: -[source,java,indent=0] +[source,java,subs="attributes,specialchars"] ---- -include::{test-examples}/stub/InitializrIntegrationTests.java[tag=test] +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.NONE) +@AutoConfigureStubRunner(ids = "io.spring.initializr:initializr-web:{spring-initializr-version}") +public class ClientApplicationTests { + + @Value("${wiremock.server.port}") + private int port; + + ... + +} ---- -[TIP] -==== -If you want to test a specific version or validate your API against multiple versions -you can define the version to use in the annotation, something like +Here is an example of a test that retrieves the metadata of the service. The assertions +do not matter much here but it illustrates how you could integrate that in the test suite +of a custom client: -[source,java,indent=0,subs="attributes+"] +[source,java,indent=0,subs="verbatim,quotes,attributes"] ---- - @AutoConfigureStubRunner( - ids = "io.spring.initializr:initializr-web:{spring-initializr-version}", - workOffline = true) - public class InitializrIntegrationTests { - ... - } +include::{test-examples}/stub/ClientApplicationTests.java[tag=test] ---- -==== Then you have a server that returns the stub of the JSON metadata (`metadataWithCurrentAcceptHeader.json`) when you send it a header diff --git a/initializr-docs/src/test/java/io/spring/initializr/stub/InitializrIntegrationTests.java b/initializr-docs/src/test/java/io/spring/initializr/stub/ClientApplicationTests.java similarity index 95% rename from initializr-docs/src/test/java/io/spring/initializr/stub/InitializrIntegrationTests.java rename to initializr-docs/src/test/java/io/spring/initializr/stub/ClientApplicationTests.java index d2020175..54f772bc 100644 --- a/initializr-docs/src/test/java/io/spring/initializr/stub/InitializrIntegrationTests.java +++ b/initializr-docs/src/test/java/io/spring/initializr/stub/ClientApplicationTests.java @@ -23,13 +23,13 @@ import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.Assertions.*; import static org.springframework.boot.test.context.SpringBootTest.*; -// tag::test[] @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.NONE) @AutoConfigureStubRunner( - ids = "io.spring.initializr:initializr-web", + ids = "io.spring.initializr:initializr-web:${project.version}", workOffline = true) -public class InitializrIntegrationTests { +// tag::test[] +public class ClientApplicationTests { @Autowired private StubFinder stubFinder;