diff --git a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java index d9908321336..de40942c33a 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java @@ -24,11 +24,11 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.Assert; /** - * Base class for {@code RequestExpectationManager} implementations. - * Creates and contains expectations and stores actual requests. + * Base class for {@code RequestExpectationManager} implementations responsible + * for storing expectations and requests. * - *
Sub-classes are responsible for matching actual to expected requests and - * for verifying remaining expectations at the end. + *
Sub-classes are responsible for matching requests to expectations and
+ * verifying there are no remaining expectations at the end.
*
* @author Rossen Stoyanchev
* @since 4.3
@@ -40,30 +40,26 @@ public abstract class AbstractRequestExpectationManager implements RequestExpect
private final List By default {@link SimpleRequestExpectationManager} is used. It is
+ * also possible to switch to {@link UnorderedRequestExpectationManager}
+ * by setting {@link #unordered()}.
+ */
+ MockRestServiceServerBuilder expectationManager(RequestExpectationManager manager);
/**
* Build the {@code MockRestServiceServer} and setting up the underlying
@@ -220,7 +229,7 @@ public class MockRestServiceServer {
private final AsyncRestTemplate asyncRestTemplate;
- private boolean ignoreExpectOrder;
+ private RequestExpectationManager expectationManager = new SimpleRequestExpectationManager();
public DefaultBuilder(RestTemplate restTemplate) {
@@ -237,19 +246,21 @@ public class MockRestServiceServer {
@Override
- public MockRestServiceServerBuilder ignoreExpectOrder() {
- this.ignoreExpectOrder = true;
+ public MockRestServiceServerBuilder unordered() {
+ expectationManager(new UnorderedRequestExpectationManager());
return this;
}
+ @Override
+ public MockRestServiceServerBuilder expectationManager(RequestExpectationManager manager) {
+ Assert.notNull(manager, "'manager' is required.");
+ this.expectationManager = manager;
+ return this;
+ }
@Override
public MockRestServiceServer build() {
-
- MockRestServiceServer server = (this.ignoreExpectOrder ?
- new MockRestServiceServer(new UnorderedRequestExpectationManager()) :
- new MockRestServiceServer());
-
+ MockRestServiceServer server = new MockRestServiceServer(this.expectationManager);
MockClientHttpRequestFactory factory = server.new MockClientHttpRequestFactory();
if (this.restTemplate != null) {
this.restTemplate.setRequestFactory(factory);
@@ -257,7 +268,6 @@ public class MockRestServiceServer {
if (this.asyncRestTemplate != null) {
this.asyncRestTemplate.setAsyncRequestFactory(factory);
}
-
return server;
}
}
@@ -265,7 +275,7 @@ public class MockRestServiceServer {
/**
* Mock ClientHttpRequestFactory that creates requests by iterating
- * over the list of expected {@link DefaultResponseActions}'s.
+ * over the list of expected {@link DefaultRequestExpectation}'s.
*/
private class MockClientHttpRequestFactory implements ClientHttpRequestFactory, AsyncClientHttpRequestFactory {
diff --git a/spring-test/src/main/java/org/springframework/test/web/client/RequestExpectation.java b/spring-test/src/main/java/org/springframework/test/web/client/RequestExpectation.java
index cec8c3744b9..971139ac1a6 100644
--- a/spring-test/src/main/java/org/springframework/test/web/client/RequestExpectation.java
+++ b/spring-test/src/main/java/org/springframework/test/web/client/RequestExpectation.java
@@ -16,12 +16,16 @@
package org.springframework.test.web.client;
/**
- * A contract that combines {@code RequestMatcher} with {@code ResponseCreator}
- * to define an expected request and a response to use for it.
+ * An extension of {@code ResponseActions} that also implements
+ * {@code RequestMatcher} and {@code ResponseCreator}
+ *
+ * {@code ResponseActions} is the API for defining expectations while
+ * {@code RequestExpectation} is the internal SPI to match those expectations
+ * to actual requests and to create responses.
*
* @author Rossen Stoyanchev
* @since 4.3
*/
-public interface RequestExpectation extends RequestMatcher, ResponseCreator {
+public interface RequestExpectation extends ResponseActions, RequestMatcher, ResponseCreator {
}
diff --git a/spring-test/src/main/java/org/springframework/test/web/client/SimpleRequestExpectationManager.java b/spring-test/src/main/java/org/springframework/test/web/client/SimpleRequestExpectationManager.java
index 7a58679778d..ba37fbb18a3 100644
--- a/spring-test/src/main/java/org/springframework/test/web/client/SimpleRequestExpectationManager.java
+++ b/spring-test/src/main/java/org/springframework/test/web/client/SimpleRequestExpectationManager.java
@@ -24,8 +24,8 @@ import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpResponse;
/**
- * {@code RequestExpectationManager} that expects requests to follow the order
- * in which expected requests were declared.
+ * Simple {@code RequestExpectationManager} that matches requests to expectations
+ * sequentially, i.e. in the order of declaration of expectations.
*
* @author Rossen Stoyanchev
* @since 4.3
@@ -43,7 +43,8 @@ public class SimpleRequestExpectationManager extends AbstractRequestExpectationM
if (!this.iterator.hasNext()) {
HttpMethod method = request.getMethod();
URI uri = request.getURI();
- throw new AssertionError("No further requests expected: HTTP " + method + " " + uri);
+ String firstLine = "No further requests expected: HTTP " + method + " " + uri + "\n";
+ throw new AssertionError(createErrorMessage(firstLine));
}
RequestExpectation expectation = this.iterator.next();
expectation.match(request);
@@ -55,11 +56,11 @@ public class SimpleRequestExpectationManager extends AbstractRequestExpectationM
if (getExpectations().isEmpty() || getExpectations().size() == getRequests().size()) {
return;
}
- throw new AssertionError(getVerifyMessage());
+ throw new AssertionError(createErrorMessage("Further request(s) expected\n"));
}
- private String getVerifyMessage() {
- StringBuilder sb = new StringBuilder("Further request(s) expected\n");
+ private String createErrorMessage(String firstLine) {
+ StringBuilder sb = new StringBuilder(firstLine);
if (getRequests().size() > 0) {
sb.append("The following ");
}
diff --git a/spring-test/src/main/java/org/springframework/test/web/client/UnorderedRequestExpectationManager.java b/spring-test/src/main/java/org/springframework/test/web/client/UnorderedRequestExpectationManager.java
index 2e658d60776..eab0d4d4550 100644
--- a/spring-test/src/main/java/org/springframework/test/web/client/UnorderedRequestExpectationManager.java
+++ b/spring-test/src/main/java/org/springframework/test/web/client/UnorderedRequestExpectationManager.java
@@ -25,9 +25,8 @@ import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpResponse;
/**
- * {@code RequestExpectationManager} that tries to match actual requests to
- * expected requests regardless of the order in which expected requests were
- * declared.
+ * {@code RequestExpectationManager} that matches requests to expectations
+ * regardless of the order of declaration of expectations.
*
* @author Rossen Stoyanchev
* @since 4.3
@@ -37,23 +36,20 @@ public class UnorderedRequestExpectationManager extends AbstractRequestExpectati
private final List
+ * {@code builder.expectationManager(new UnorderedRequestExpectationManager)}
*/
- MockRestServiceServerBuilder ignoreExpectOrder();
+ MockRestServiceServerBuilder unordered();
+
+ /**
+ * Configure a custom {@code RequestExpectationManager}.
+ *