Migrate Wiremock to Spring Boot 2.0

This commit is contained in:
Dave Syer
2017-06-15 17:43:28 +01:00
parent c1fca13f12
commit a0d08245d5
3 changed files with 70 additions and 55 deletions

View File

@@ -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<ConfigurableServletWebServerFactory> {
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<WireMockHandlerDispatchingServlet> stubServletRegistration() {
ServletRegistrationBean<WireMockHandlerDispatchingServlet> 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<WireMockHandlerDispatchingServlet> adminServletRegistration() {
ServletRegistrationBean<WireMockHandlerDispatchingServlet> 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());
}
}
}

View File

@@ -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 {

View File

@@ -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<RequestCookie> getCookies() {
return Collections.emptySet();
}
};
}
@@ -197,6 +206,11 @@ public class WireMockSnippetTests {
public URI getUri() {
return URI.create("http://foo/bar");
}
@Override
public Collection<RequestCookie> getCookies() {
return Collections.emptySet();
}
};
}
}