diff --git a/docs/src/main/asciidoc/spring-cloud-wiremock.adoc b/docs/src/main/asciidoc/spring-cloud-wiremock.adoc index 8630a1bca3..49069facb7 100644 --- a/docs/src/main/asciidoc/spring-cloud-wiremock.adoc +++ b/docs/src/main/asciidoc/spring-cloud-wiremock.adoc @@ -160,6 +160,19 @@ Spring Boot embedded servers, and Wiremock itself has "native" support for a par version of Jetty (currently 9.2). To use the native Jetty, you need to add the native Wiremock dependencies and exclude the Spring Boot container (if there is one). +=== Customization of WireMock configuration + +You can register a bean of `org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizer` type +in order to customize the WireMock configuration (e.g. add custom transformers). +Example: + +[source,java,indent=0] +---- +include::{wiremock_tests}/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java[tags=customizer_1] +// perform your customization here +include::{wiremock_tests}/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java[tags=customizer_2] +---- + === Generating Stubs using REST Docs https://projects.spring.io/spring-restdocs[Spring REST Docs] can be used to generate 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 93271f7b3e..cbc51c365c 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 @@ -62,6 +62,9 @@ public class WireMockConfiguration implements SmartLifecycle { @Autowired(required = false) private Options options; + @Autowired(required = false) + private WireMockConfigurationCustomizer customizer; + @Autowired private DefaultListableBeanFactory beanFactory; @@ -84,6 +87,9 @@ public class WireMockConfiguration implements SmartLifecycle { registerFiles(factory); factory.notifier(new Slf4jNotifier(true)); this.options = factory; + if (this.customizer != null) { + this.customizer.customize(factory); + } } this.server = new WireMockServer(this.options); registerStubs(); diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfigurationCustomizer.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfigurationCustomizer.java new file mode 100644 index 0000000000..709e0405d8 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfigurationCustomizer.java @@ -0,0 +1,12 @@ +package org.springframework.cloud.contract.wiremock; + +/** + * Allows customization of {@link com.github.tomakehurst.wiremock.core.WireMockConfiguration} + * + * @author Marcin Grzejszczak + * @since 1.2.2 + */ +public interface WireMockConfigurationCustomizer { + + void customize(com.github.tomakehurst.wiremock.core.WireMockConfiguration config); +} 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 new file mode 100644 index 0000000000..b79c65f012 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockConfigurationCustomizerTests.java @@ -0,0 +1,58 @@ +package org.springframework.cloud.contract.wiremock; + +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +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.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes={WiremockTestsApplication.class, + 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 { + + @Autowired + private Service service; + @Autowired + private Config config; + + @Test + public void contextLoads() throws Exception { + assertThat(this.service.go()).isEqualTo("Hello World"); + assertThat(this.config.isExecuted()).isTrue(); + } + + @Configuration + protected static class Config { + + boolean executed = false; + + // tag::customizer_1[] + @Bean WireMockConfigurationCustomizer optionsCustomizer() { + return new WireMockConfigurationCustomizer() { + @Override public void customize(WireMockConfiguration options) { + // end::customizer_1[] + assertThat(options.portNumber()).isGreaterThan(0); + Config.this.executed = true; + // tag::customizer_2[] + } + }; + } + // end::customizer_2[] + + public boolean isExecuted() { + return executed; + } + } +} 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 4c9740c839..df1a184074 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 @@ -57,4 +57,8 @@ class Service { public String go() { return this.restTemplate.getForEntity(this.base + "/test", String.class).getBody(); } + + public void setBase(String base) { + this.base = base; + } }