Removed dirties context on any tests

This commit is contained in:
Marcin Grzejszczak
2018-08-08 18:00:58 +02:00
73 changed files with 343 additions and 113 deletions

View File

@@ -27,6 +27,9 @@ import java.util.ArrayList;
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;
@@ -37,9 +40,15 @@ 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
* WireMock server. Can be used by adding
@@ -55,6 +64,10 @@ import org.springframework.util.StringUtils;
@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 +104,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 +136,10 @@ public class WireMockConfiguration implements SmartLifecycle {
}
}
void reset() {
this.server.resetAll();
}
private void registerFiles(com.github.tomakehurst.wiremock.core.WireMockConfiguration factory) throws IOException {
List<Resource> resources = new ArrayList<>();
for (String files : this.wireMock.getServer().getFiles()) {
@@ -142,6 +164,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 +176,9 @@ public class WireMockConfiguration implements SmartLifecycle {
if (this.running) {
this.server.stop();
this.running = false;
if (log.isDebugEnabled()) {
log.debug("Stopped WireMock instance");
}
}
}

View File

@@ -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);
}
}

View File

@@ -7,3 +7,7 @@ org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs=\
org.springframework.cloud.contract.wiremock.restdocs.WireMockRestDocsConfiguration,\
org.springframework.cloud.contract.wiremock.restdocs.WireMockWebTestClientConfiguration,\
org.springframework.cloud.contract.wiremock.restdocs.WireMockRestAssuredConfiguration
# Test Execution Listeners
org.springframework.test.context.TestExecutionListener=\
org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener

View File

@@ -1,23 +1,24 @@
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;
import com.github.tomakehurst.wiremock.WireMockServer;
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 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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!");
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -39,7 +39,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;

View File

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

View File

@@ -26,7 +26,6 @@ import wiremock.org.eclipse.jetty.http.HttpStatus;
@ContextConfiguration(classes = TestConfiguration.class)
@AutoConfigureRestDocs(outputDir = "target/snippets/webtestclient")
@AutoConfigureWebTestClient
@DirtiesContext
public class WiremockServerWebTestClientApplicationTests {
@Autowired

View File

@@ -51,7 +51,7 @@ class Controller {
class Service {
@Value("${app.baseUrl:http://example.org}")
private String base;
String base;
private RestTemplate restTemplate;
@@ -76,6 +76,10 @@ class Service {
.map(MediaType::valueOf).toArray(MediaType[]::new);
}
public String go2() {
return this.restTemplate.getForEntity(this.base + "/test2", String.class).getBody();
}
public void setBase(String base) {
this.base = base;
}

View File

@@ -0,0 +1,3 @@
logging:
level:
org.springframework.cloud.contract: debug