MockRestRequestMatchers can match query params
Issue: SPR-14995
This commit is contained in:
@@ -24,16 +24,19 @@ import javax.xml.xpath.XPathExpressionException;
|
||||
|
||||
import org.hamcrest.Matcher;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.client.ClientHttpRequest;
|
||||
import org.springframework.test.util.AssertionErrors;
|
||||
import org.springframework.test.web.client.MockRestServiceServer;
|
||||
import org.springframework.test.web.client.RequestMatcher;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.*;
|
||||
import static org.springframework.test.util.AssertionErrors.*;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.springframework.test.util.AssertionErrors.assertEquals;
|
||||
import static org.springframework.test.util.AssertionErrors.assertTrue;
|
||||
|
||||
/**
|
||||
* Static factory methods for {@link RequestMatcher} classes. Typically used to
|
||||
@@ -60,6 +63,21 @@ public abstract class MockRestRequestMatchers {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert the {@link HttpMethod} of the request.
|
||||
* @param method the HTTP method
|
||||
* @return the request matcher
|
||||
*/
|
||||
public static RequestMatcher method(final HttpMethod method) {
|
||||
Assert.notNull(method, "'method' must not be null");
|
||||
return new RequestMatcher() {
|
||||
@Override
|
||||
public void match(ClientHttpRequest request) throws AssertionError {
|
||||
AssertionErrors.assertEquals("Unexpected HttpMethod", method, request.getMethod());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert the request URI string with the given matcher.
|
||||
* @param matcher String matcher for the expected URI
|
||||
@@ -90,21 +108,6 @@ public abstract class MockRestRequestMatchers {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert the {@link HttpMethod} of the request.
|
||||
* @param method the HTTP method
|
||||
* @return the request matcher
|
||||
*/
|
||||
public static RequestMatcher method(final HttpMethod method) {
|
||||
Assert.notNull(method, "'method' must not be null");
|
||||
return new RequestMatcher() {
|
||||
@Override
|
||||
public void match(ClientHttpRequest request) throws AssertionError {
|
||||
AssertionErrors.assertEquals("Unexpected HttpMethod", method, request.getMethod());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Expect a request to the given URI.
|
||||
* @param uri the expected URI
|
||||
@@ -120,6 +123,55 @@ public abstract class MockRestRequestMatchers {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert request query parameter values with the given Hamcrest matcher.
|
||||
*/
|
||||
@SafeVarargs
|
||||
public static RequestMatcher queryParam(final String name, final Matcher<? super String>... matchers) {
|
||||
return new RequestMatcher() {
|
||||
@Override
|
||||
public void match(ClientHttpRequest request) {
|
||||
MultiValueMap<String, String> params = getQueryParams(request);
|
||||
assertValueCount("query param", name, params, matchers.length);
|
||||
for (int i = 0 ; i < matchers.length; i++) {
|
||||
assertThat("Query param", params.get(name).get(i), matchers[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert request query parameter values.
|
||||
*/
|
||||
public static RequestMatcher queryParam(final String name, final String... expectedValues) {
|
||||
return new RequestMatcher() {
|
||||
@Override
|
||||
public void match(ClientHttpRequest request) {
|
||||
MultiValueMap<String, String> params = getQueryParams(request);
|
||||
assertValueCount("query param", name, params, expectedValues.length);
|
||||
for (int i = 0 ; i < expectedValues.length; i++) {
|
||||
assertEquals("Query param + [" + name + "]", expectedValues[i], params.get(name).get(i));
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static MultiValueMap<String, String> getQueryParams(ClientHttpRequest request) {
|
||||
return UriComponentsBuilder.fromUri(request.getURI()).build().getQueryParams();
|
||||
}
|
||||
|
||||
private static void assertValueCount(String valueType, final String name,
|
||||
MultiValueMap<String, String> map, int count) {
|
||||
|
||||
List<String> values = map.get(name);
|
||||
|
||||
String message = "Expected " + valueType + " <" + name + ">";
|
||||
assertNotNull(message, values);
|
||||
|
||||
assertTrue(message + " to have at least <" + count + "> values but found " + values,
|
||||
count <= values.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert request header values with the given Hamcrest matcher.
|
||||
*/
|
||||
@@ -128,7 +180,7 @@ public abstract class MockRestRequestMatchers {
|
||||
return new RequestMatcher() {
|
||||
@Override
|
||||
public void match(ClientHttpRequest request) {
|
||||
assertHeaderValueCount(name, request.getHeaders(), matchers.length);
|
||||
assertValueCount("header", name, request.getHeaders(), matchers.length);
|
||||
for (int i = 0 ; i < matchers.length; i++) {
|
||||
assertThat("Request header", request.getHeaders().get(name).get(i), matchers[i]);
|
||||
}
|
||||
@@ -143,7 +195,7 @@ public abstract class MockRestRequestMatchers {
|
||||
return new RequestMatcher() {
|
||||
@Override
|
||||
public void match(ClientHttpRequest request) {
|
||||
assertHeaderValueCount(name, request.getHeaders(), expectedValues.length);
|
||||
assertValueCount("header", name, request.getHeaders(), expectedValues.length);
|
||||
for (int i = 0 ; i < expectedValues.length; i++) {
|
||||
assertEquals("Request header + [" + name + "]",
|
||||
expectedValues[i], request.getHeaders().get(name).get(i));
|
||||
@@ -152,13 +204,6 @@ public abstract class MockRestRequestMatchers {
|
||||
};
|
||||
}
|
||||
|
||||
private static void assertHeaderValueCount(final String name, HttpHeaders headers, int expectedCount) {
|
||||
List<String> actualValues = headers.get(name);
|
||||
AssertionErrors.assertTrue("Expected header <" + name + ">", actualValues != null);
|
||||
AssertionErrors.assertTrue("Expected header <" + name + "> to have at least <" + expectedCount +
|
||||
"> values but found " + actualValues, expectedCount <= actualValues.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Access to request body matchers.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user