Tweak mock server builder so that it ignores order by default

If user loads stubs from a directory, the order of the resources
is best left to the comparator by default. If the user wants to
order stubs explicitly, she now has to use ignoreExpectOrder(false)
(the default is true, unlike the normal mock mvc server).
This commit is contained in:
Dave Syer
2016-10-11 16:08:21 +02:00
parent 0fc5642ddb
commit 0f41f4a4dc
2 changed files with 44 additions and 16 deletions

View File

@@ -71,6 +71,8 @@ public class WireMockRestServiceServer {
private List<String> locations = new ArrayList<String>();
private boolean ignoreExpectOrder = true;
private WireMockRestServiceServer(RestTemplate restTemplate) {
this.builder = MockRestServiceServer.bindTo(restTemplate);
}
@@ -87,12 +89,14 @@ public class WireMockRestServiceServer {
/**
* Flag to tell the MockRestServiceServer to ignore the order of calls when matching
* requests.
* requests. The default is true because there is an impleid ordering in the stubs
* (by url path and with more specific request matchers first).
*
* @param ignoreExpectOrder flag value
* @param ignoreExpectOrder flag value (default true)
* @return this
*/
public WireMockRestServiceServer ignoreExpectOrder(boolean ignoreExpectOrder) {
this.ignoreExpectOrder = ignoreExpectOrder;
this.builder.ignoreExpectOrder(ignoreExpectOrder);
return this;
}
@@ -151,6 +155,9 @@ public class WireMockRestServiceServer {
* @return a MockRestServiceServer
*/
public MockRestServiceServer build() {
if (this.ignoreExpectOrder) {
builder.ignoreExpectOrder(true); // default is false
}
MockRestServiceServer server = this.builder.build();
List<StubMapping> mappings = new ArrayList<>();
for (String location : this.locations) {
@@ -165,7 +172,9 @@ public class WireMockRestServiceServer {
e);
}
}
Collections.sort(mappings, new StubMappingComparator());
if (this.ignoreExpectOrder) {
Collections.sort(mappings, new StubMappingComparator());
}
for (StubMapping mapping : mappings) {
ResponseActions expect = server
.expect(requestTo(request(mapping.getRequest())));
@@ -176,7 +185,9 @@ public class WireMockRestServiceServer {
}
private String request(RequestPattern request) {
return this.baseUrl + (request.getUrlPath() == null ? "/" : request.getUrlPath());
return this.baseUrl + (request.getUrlPath() == null
? (request.getUrl() == null ? "/" : request.getUrl())
: request.getUrlPath());
}
private String pattern(String location) {
@@ -253,7 +264,7 @@ public class WireMockRestServiceServer {
@Override
public int compare(StubMapping one, StubMapping two) {
if (one==two) {
if (one == two) {
return 0;
}
int value = request(one.getRequest()).compareTo(request(two.getRequest()));
@@ -282,7 +293,9 @@ public class WireMockRestServiceServer {
}
private String request(RequestPattern request) {
return (request.getUrlPath() == null ? (request.getUrl() == null ? "/" : request.getUrl()) : request.getUrlPath());
return (request.getUrlPath() == null
? (request.getUrl() == null ? "/" : request.getUrl())
: request.getUrlPath());
}
}

View File

@@ -67,10 +67,10 @@ public class WiremockMockServerApplicationTests {
@Test
public void postWithHeader() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") // order matters...
.baseUrl("http://example.org") // order determined by content...
.stubs("classpath:/mappings/poster.json",
"classpath:/mappings/accept.json")
.ignoreExpectOrder(true).build();
.build();
assertThat(
this.restTemplate
.exchange(
@@ -83,10 +83,10 @@ public class WiremockMockServerApplicationTests {
@Test
public void postWithHeaderContains() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") // order matters...
.baseUrl("http://example.org") // order determined by content...
.stubs("classpath:/mappings/poster.json",
"classpath:/mappings/header-contains.json")
.ignoreExpectOrder(true).build();
.build();
assertThat(this.restTemplate.exchange(
RequestEntity.post(new URI("http://example.org/poster"))
.accept(MediaType.valueOf("application/v.foo")).build(),
@@ -96,10 +96,10 @@ public class WiremockMockServerApplicationTests {
@Test
public void postWithHeaderMatches() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") // order matters...
.baseUrl("http://example.org") // order determined by content...
.stubs("classpath:/mappings/poster.json",
"classpath:/mappings/header-matches.json")
.ignoreExpectOrder(true).build();
.build();
assertThat(this.restTemplate.exchange(
RequestEntity.post(new URI("http://example.org/poster"))
.accept(MediaType.valueOf("application/v.bar")).build(),
@@ -109,10 +109,10 @@ public class WiremockMockServerApplicationTests {
@Test
public void postWithMoreExactHeaderMatch() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") // order matters...
.baseUrl("http://example.org") // order determined by content...
.stubs("classpath:/mappings/header-matches.json",
"classpath:/mappings/header-matches-precise.json")
.ignoreExpectOrder(true).build();
.build();
assertThat(this.restTemplate
.exchange(RequestEntity.post(new URI("http://example.org/poster"))
.accept(MediaType.valueOf("application/v.bar"))
@@ -120,11 +120,26 @@ public class WiremockMockServerApplicationTests {
.getBody()).isEqualTo("Precise World");
}
@Test
public void postWithMoreExactHeaderMatchButOrdered() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") // order matters...
.stubs("classpath:/mappings/header-matches.json",
"classpath:/mappings/header-matches-precise.json")
.ignoreExpectOrder(false).build();
assertThat(this.restTemplate
.exchange(RequestEntity.post(new URI("http://example.org/poster"))
.accept(MediaType.valueOf("application/v.bar"))
.header("X-Precise", "true").build(), String.class)
.getBody()).isEqualTo("Bar World");
// The first one matches, not the most precise!
}
@Test
public void simpleGetWithAllStubs() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") //
.stubs("classpath:/mappings").ignoreExpectOrder(true).build();
.stubs("classpath:/mappings").build();
assertThat(this.restTemplate.getForObject("http://example.org/resource",
String.class)).isEqualTo("Hello World");
}
@@ -133,7 +148,7 @@ public class WiremockMockServerApplicationTests {
public void simpleGetWithAllStubsInDirectoryWithPeriod() throws Exception {
WireMockRestServiceServer.with(this.restTemplate) //
.baseUrl("http://example.org") //
.stubs("classpath:/io.stubs/mappings").ignoreExpectOrder(true).build();
.stubs("classpath:/io.stubs/mappings").build();
assertThat(this.restTemplate.getForObject("http://example.org/resource",
String.class)).isEqualTo("Hello World");
}