From a0d08245d543b665e0e40b443b7b336a0bc4494a Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 15 Jun 2017 17:43:28 +0100 Subject: [PATCH] Migrate Wiremock to Spring Boot 2.0 --- .../wiremock/SpringBootHttpServerFactory.java | 85 ++++++++++--------- .../wiremock/restdocs/WireMockSnippet.java | 16 ++-- .../restdocs/WireMockSnippetTests.java | 24 ++++-- 3 files changed, 70 insertions(+), 55 deletions(-) diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java index 55afc312ba..b6104c1eb3 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/SpringBootHttpServerFactory.java @@ -44,29 +44,30 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.Banner.Mode; -import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; -import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration; -import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration.BeanPostProcessorsRegistrar; -import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.autoconfigure.web.servlet.DefaultServletWebServerFactoryCustomizer; +import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.server.ConfigurableEmbeddedServletContainer; -import org.springframework.boot.web.server.EmbeddedServletContainerCustomizer; -import org.springframework.boot.web.server.EmbeddedServletContainerFactory; -import org.springframework.boot.web.server.EmbeddedServletContainerInitializedEvent; -import org.springframework.boot.web.server.EmbeddedWebApplicationContext; -import org.springframework.boot.web.server.Ssl; -import org.springframework.boot.web.embedded.jetty.JettyEmbeddedServletContainerFactory; -import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer; -import org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedServletContainerFactory; -import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer; -import org.springframework.boot.web.embedded.undertow.UndertowEmbeddedServletContainerFactory; import org.springframework.boot.context.event.ApplicationPreparedEvent; +import org.springframework.boot.web.context.WebServerInitializedEvent; +import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer; +import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.boot.web.server.Ssl; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.cloud.contract.wiremock.ContainerConfiguration.JettyContainerConfiguration; import org.springframework.cloud.contract.wiremock.ContainerConfiguration.TomcatContainerConfiguration; import org.springframework.cloud.contract.wiremock.ContainerConfiguration.UndertowContainerConfiguration; @@ -213,7 +214,7 @@ class SpringBootHttpServer } -class WiremockServerProperties implements EmbeddedServletContainerCustomizer { +class WiremockServerProperties implements WebServerFactoryCustomizer { private ServerProperties delegate = new ServerProperties(); @@ -234,8 +235,8 @@ class WiremockServerProperties implements EmbeddedServletContainerCustomizer { } @Override - public void customize(ConfigurableEmbeddedServletContainer container) { - this.delegate.customize(container); + public void customize(ConfigurableServletWebServerFactory server) { + new DefaultServletWebServerFactoryCustomizer(this.delegate).customize(server); } } @@ -266,8 +267,8 @@ class WiremockServerConfiguration { private Options options; @Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) - public ServletRegistrationBean stubServletRegistration() { - ServletRegistrationBean reg = new ServletRegistrationBean(); + public ServletRegistrationBean stubServletRegistration() { + ServletRegistrationBean reg = new ServletRegistrationBean<>(); reg.addInitParameter(RequestHandler.HANDLER_CLASS_KEY, StubRequestHandler.class.getName()); if (WiremockServerConfiguration.this.faultInjectorFactory != null) { @@ -281,8 +282,8 @@ class WiremockServerConfiguration { } @Bean - public ServletRegistrationBean adminServletRegistration() { - ServletRegistrationBean reg = new ServletRegistrationBean(); + public ServletRegistrationBean adminServletRegistration() { + ServletRegistrationBean reg = new ServletRegistrationBean<>(); reg.addInitParameter(RequestHandler.HANDLER_CLASS_KEY, AdminRequestHandler.class.getName()); reg.setServlet(new WireMockHandlerDispatchingServlet()); @@ -336,8 +337,8 @@ class ContainerProperties { if (this.localPort != null) { return this.localPort; } - EmbeddedWebApplicationContext embedded = (EmbeddedWebApplicationContext) this.context; - return embedded.getEmbeddedServletContainer().getPort(); + ServletWebServerApplicationContext embedded = (ServletWebServerApplicationContext) this.context; + return embedded.getWebServer().getPort(); } public int httpsPort() { @@ -360,8 +361,8 @@ class ContainerProperties { class ContainerConfiguration { @Configuration - @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) - @ConditionalOnClass({ TomcatEmbeddedServletContainerFactory.class, Connector.class }) + @ConditionalOnMissingBean(ServletWebServerFactory.class) + @ConditionalOnClass({ TomcatServletWebServerFactory.class, Connector.class }) static class TomcatContainerConfiguration { @Autowired private Options options; @@ -372,8 +373,8 @@ class ContainerConfiguration { private Connector connector; @Bean - public EmbeddedServletContainerFactory servletContainer() { - TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); + public ServletWebServerFactory servletContainer() { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); if (this.options.httpsSettings().enabled()) { tomcat.addAdditionalTomcatConnectors(createStandardConnector()); } @@ -386,11 +387,11 @@ class ContainerConfiguration { } @EventListener - public void serverUp(EmbeddedServletContainerInitializedEvent event) { + public void serverUp(WebServerInitializedEvent event) { if (this.connector != null) { this.container.setLocalPort(this.connector.getLocalPort()); this.container - .setLocalHttpsPort(event.getEmbeddedServletContainer().getPort()); + .setLocalHttpsPort(event.getWebServer().getPort()); } } @@ -405,8 +406,8 @@ class ContainerConfiguration { } @Configuration - @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) - @ConditionalOnClass({ UndertowEmbeddedServletContainerFactory.class, Builder.class }) + @ConditionalOnMissingBean(ServletWebServerFactory.class) + @ConditionalOnClass({ UndertowServletWebServerFactory.class, Builder.class }) static class UndertowContainerConfiguration { @Autowired @@ -418,8 +419,8 @@ class ContainerConfiguration { private Integer port; @Bean - public EmbeddedServletContainerFactory servletContainer() { - UndertowEmbeddedServletContainerFactory undertow = new UndertowEmbeddedServletContainerFactory(); + public ServletWebServerFactory servletContainer() { + UndertowServletWebServerFactory undertow = new UndertowServletWebServerFactory(); if (this.options.httpsSettings().enabled()) { undertow.addBuilderCustomizers(new UndertowBuilderCustomizer() { @Override @@ -441,20 +442,20 @@ class ContainerConfiguration { } @EventListener - public void serverUp(EmbeddedServletContainerInitializedEvent event) { + public void serverUp(WebServerInitializedEvent event) { if (this.port != null) { // TODO: make it dynamic as well this.container.setLocalPort(this.port); this.container - .setLocalHttpsPort(event.getEmbeddedServletContainer().getPort()); + .setLocalHttpsPort(event.getWebServer().getPort()); } } } @Configuration - @ConditionalOnMissingBean(EmbeddedServletContainerFactory.class) - @ConditionalOnClass({ JettyEmbeddedServletContainerFactory.class, + @ConditionalOnMissingBean(ServletWebServerFactory.class) + @ConditionalOnClass({ JettyServletWebServerFactory.class, ServerConnector.class }) static class JettyContainerConfiguration { @@ -467,8 +468,8 @@ class ContainerConfiguration { private ServerConnector connector; @Bean - public EmbeddedServletContainerFactory servletContainer() { - final JettyEmbeddedServletContainerFactory jetty = new JettyEmbeddedServletContainerFactory(); + public ServletWebServerFactory servletContainer() { + final JettyServletWebServerFactory jetty = new JettyServletWebServerFactory(); if (this.options.httpsSettings().enabled()) { jetty.addServerCustomizers(new JettyServerCustomizer() { @Override @@ -502,11 +503,11 @@ class ContainerConfiguration { } @EventListener - public void serverUp(EmbeddedServletContainerInitializedEvent event) { + public void serverUp(WebServerInitializedEvent event) { if (this.connector != null) { this.container.setLocalPort(this.connector.getLocalPort()); this.container - .setLocalHttpsPort(event.getEmbeddedServletContainer().getPort()); + .setLocalHttpsPort(event.getWebServer().getPort()); } } } diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java index b09a3821f4..7bb2025162 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java @@ -27,11 +27,6 @@ import java.util.LinkedHashSet; import java.util.Set; import java.util.regex.Pattern; -import org.springframework.http.MediaType; -import org.springframework.restdocs.RestDocumentationContext; -import org.springframework.restdocs.operation.Operation; -import org.springframework.restdocs.snippet.Snippet; - import com.github.tomakehurst.wiremock.client.MappingBuilder; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; import com.github.tomakehurst.wiremock.common.Json; @@ -40,19 +35,24 @@ import com.github.tomakehurst.wiremock.http.HttpHeaders; import com.github.tomakehurst.wiremock.matching.UrlPattern; import com.github.tomakehurst.wiremock.stubbing.StubMapping; +import org.springframework.http.MediaType; +import org.springframework.restdocs.RestDocumentationContext; +import org.springframework.restdocs.operation.Operation; +import org.springframework.restdocs.snippet.Snippet; + import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.delete; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.head; import static com.github.tomakehurst.wiremock.client.WireMock.matching; import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath; -import static com.github.tomakehurst.wiremock.client.WireMock.patch; -import static com.github.tomakehurst.wiremock.client.WireMock.head; import static com.github.tomakehurst.wiremock.client.WireMock.options; -import static com.github.tomakehurst.wiremock.client.WireMock.trace; +import static com.github.tomakehurst.wiremock.client.WireMock.patch; import static com.github.tomakehurst.wiremock.client.WireMock.post; import static com.github.tomakehurst.wiremock.client.WireMock.put; +import static com.github.tomakehurst.wiremock.client.WireMock.trace; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; public class WireMockSnippet implements Snippet { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java index 47e1822c0c..b87090a9f7 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java @@ -6,6 +6,10 @@ import java.net.URI; import java.nio.charset.Charset; import java.nio.file.Files; import java.util.Collection; +import java.util.Collections; + +import com.github.tomakehurst.wiremock.matching.EqualToJsonPattern; +import com.github.tomakehurst.wiremock.stubbing.StubMapping; import org.junit.Before; import org.junit.Rule; @@ -14,25 +18,25 @@ import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; + import org.springframework.cloud.contract.wiremock.WireMockStubMapping; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.restdocs.ManualRestDocumentation; import org.springframework.restdocs.RestDocumentationContext; import org.springframework.restdocs.operation.Operation; import org.springframework.restdocs.operation.OperationRequest; import org.springframework.restdocs.operation.OperationRequestPart; import org.springframework.restdocs.operation.OperationResponse; import org.springframework.restdocs.operation.Parameters; - -import com.github.tomakehurst.wiremock.matching.EqualToJsonPattern; -import com.github.tomakehurst.wiremock.stubbing.StubMapping; +import org.springframework.restdocs.operation.RequestCookie; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; -import static org.mockito.Matchers.anyString; /** * @author Marcin Grzejszczak @@ -154,6 +158,11 @@ public class WireMockSnippetTests { public URI getUri() { return URI.create("http://foo/bar"); } + + @Override + public Collection getCookies() { + return Collections.emptySet(); + } }; } @@ -197,6 +206,11 @@ public class WireMockSnippetTests { public URI getUri() { return URI.create("http://foo/bar"); } + + @Override + public Collection getCookies() { + return Collections.emptySet(); + } }; } } \ No newline at end of file