From f7943786deb06605274a7b9e68f2b0e3a2ad9e17 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 11 Oct 2012 22:11:00 -0400 Subject: [PATCH] Polish Spring MVC Test code Remove use of UriTemplate in MockMvcRequestBuilders. Rely on UriComponentsBuilder instead. Decode query params before setting them on MockHttpServletRequest. Add more options to model result matching for the count of errors. Ignore white spaces and comments when comparing XML. --- .../MockHttpServletRequestBuilder.java | 51 ++++++++------ ...ockMultipartHttpServletRequestBuilder.java | 8 ++- .../request/MockMvcRequestBuilders.java | 51 +++++--------- .../servlet/result/ContentResultMatchers.java | 6 +- .../servlet/result/ModelResultMatchers.java | 66 ++++++++++++++++--- .../mock/support/XmlExpectationsHelper.java | 5 ++ .../MockHttpServletRequestBuilderTests.java | 49 ++++++++------ .../result/ContentResultMatchersTests.java | 4 +- .../samples/context/WebAppResourceTests.java | 2 +- .../standalone/RequestParameterTests.java | 2 +- .../samples/standalone/ResponseBodyTests.java | 2 +- .../standalone/ViewResolutionTests.java | 8 +-- .../resultmatchers/ContentAssertionTests.java | 8 +-- .../JsonPathAssertionTests.java | 2 +- .../XmlContentAssertionTests.java | 2 +- .../resultmatchers/XpathAssertionTests.java | 2 +- 16 files changed, 161 insertions(+), 107 deletions(-) diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilder.java b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilder.java index 9d2a4136cf0..a1ead6e8379 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilder.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilder.java @@ -16,8 +16,8 @@ package org.springframework.test.web.mock.servlet.request; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Constructor; -import java.net.URI; import java.security.Principal; import java.util.ArrayList; import java.util.Arrays; @@ -31,9 +31,9 @@ import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.http.Cookie; +import org.springframework.beans.BeanUtils; import org.springframework.beans.Mergeable; import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.BeanUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; @@ -58,6 +58,7 @@ import org.springframework.web.servlet.FlashMapManager; import org.springframework.web.servlet.support.SessionFlashMapManager; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.UriUtils; /** * Default builder for {@link MockHttpServletRequest} required as input to @@ -72,7 +73,7 @@ import org.springframework.web.util.UriComponentsBuilder; */ public class MockHttpServletRequestBuilder implements RequestBuilder, Mergeable { - private final UriComponentsBuilder uriComponentsBuilder; + private final UriComponents uriComponents; private final HttpMethod method; @@ -120,15 +121,15 @@ public class MockHttpServletRequestBuilder implements RequestBuilder, Mergeable * the {@code MockHttpServletRequest} can be plugged in via * {@link #with(RequestPostProcessor)}. * - * @param uri the URI for the request including any component (e.g. scheme, host, query) - * @param httpMethod the HTTP method for the request + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ - MockHttpServletRequestBuilder(URI uri, HttpMethod httpMethod) { + MockHttpServletRequestBuilder(HttpMethod httpMethod, String urlTemplate, Object... urlVariables) { - Assert.notNull(uri, "uri is required"); + Assert.notNull(urlTemplate, "uriTemplate is required"); Assert.notNull(httpMethod, "httpMethod is required"); - this.uriComponentsBuilder = UriComponentsBuilder.fromUri(uri); + this.uriComponents = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(urlVariables).encode(); this.method = httpMethod; } @@ -196,7 +197,7 @@ public class MockHttpServletRequestBuilder implements RequestBuilder, Mergeable * * @param content the body content */ - public MockHttpServletRequestBuilder body(byte[] content) { + public MockHttpServletRequestBuilder content(byte[] content) { this.content = content; return this; } @@ -532,21 +533,19 @@ public class MockHttpServletRequestBuilder implements RequestBuilder, Mergeable MockHttpServletRequest request = createServletRequest(servletContext); - UriComponents uriComponents = this.uriComponentsBuilder.build(); - - String requestUri = uriComponents.getPath(); + String requestUri = this.uriComponents.getPath(); request.setRequestURI(requestUri); updatePathRequestProperties(request, requestUri); - if (uriComponents.getScheme() != null) { - request.setScheme(uriComponents.getScheme()); + if (this.uriComponents.getScheme() != null) { + request.setScheme(this.uriComponents.getScheme()); } - if (uriComponents.getHost() != null) { + if (this.uriComponents.getHost() != null) { request.setServerName(uriComponents.getHost()); } - if (uriComponents.getPort() != -1) { - request.setServerPort(uriComponents.getPort()); + if (this.uriComponents.getPort() != -1) { + request.setServerPort(this.uriComponents.getPort()); } request.setMethod(this.method.name()); @@ -557,13 +556,23 @@ public class MockHttpServletRequestBuilder implements RequestBuilder, Mergeable } } - request.setQueryString(uriComponents.getQuery()); + try { + if (this.uriComponents.getQuery() != null) { + String query = UriUtils.decode(this.uriComponents.getQuery(), "UTF-8"); + request.setQueryString(query); + } - for (Entry> entry : uriComponents.getQueryParams().entrySet()) { - for (String value : entry.getValue()) { - request.addParameter(entry.getKey(), value); + for (Entry> entry : this.uriComponents.getQueryParams().entrySet()) { + for (String value : entry.getValue()) { + request.addParameter( + UriUtils.decode(entry.getKey(), "UTF-8"), + UriUtils.decode(value, "UTF-8")); + } } } + catch (UnsupportedEncodingException ex) { + // shouldn't happen + } for (String name : this.parameters.keySet()) { for (String value : this.parameters.get(name)) { diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMultipartHttpServletRequestBuilder.java b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMultipartHttpServletRequestBuilder.java index 538ad92870d..df2ab3776fa 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMultipartHttpServletRequestBuilder.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMultipartHttpServletRequestBuilder.java @@ -17,7 +17,6 @@ package org.springframework.test.web.mock.servlet.request; import java.lang.reflect.Constructor; -import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -51,9 +50,12 @@ public class MockMultipartHttpServletRequestBuilder extends MockHttpServletReque *

For other ways to initialize a {@code MockMultipartHttpServletRequest}, * see {@link #with(RequestPostProcessor)} and the * {@link RequestPostProcessor} extension point. + * + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ - MockMultipartHttpServletRequestBuilder(URI uri) { - super(uri, HttpMethod.POST); + MockMultipartHttpServletRequestBuilder(String urlTemplate, Object... urlVariables) { + super(HttpMethod.POST, urlTemplate, urlVariables); super.contentType(MediaType.MULTIPART_FORM_DATA); } diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMvcRequestBuilders.java b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMvcRequestBuilders.java index daf0d64e403..77cc92390bd 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMvcRequestBuilders.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/request/MockMvcRequestBuilders.java @@ -15,11 +15,8 @@ */ package org.springframework.test.web.mock.servlet.request; -import java.net.URI; - import org.springframework.http.HttpMethod; import org.springframework.test.web.mock.servlet.RequestBuilder; -import org.springframework.web.util.UriTemplate; /** * Static factory methods for {@link RequestBuilder}s. @@ -39,69 +36,51 @@ public abstract class MockMvcRequestBuilders { /** * Create a {@link MockHttpServletRequestBuilder} for a GET request. * - * @param urlTemplate a URI template including any component (e.g. scheme, host, query) - * @param urlVariables zero or more URI variables + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ public static MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables) { - return request(HttpMethod.GET, urlTemplate, urlVariables); + return new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, urlVariables); } /** * Create a {@link MockHttpServletRequestBuilder} for a POST request. * - * @param urlTemplate a URI template including any component (e.g. scheme, host, query) - * @param urlVariables zero or more URI variables + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ public static MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables) { - return request(HttpMethod.POST, urlTemplate, urlVariables); + return new MockHttpServletRequestBuilder(HttpMethod.POST, urlTemplate, urlVariables); } /** * Create a {@link MockHttpServletRequestBuilder} for a PUT request. * - * @param urlTemplate a URI template including any component (e.g. scheme, host, query) - * @param urlVariables zero or more URI variables + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ public static MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables) { - return request(HttpMethod.PUT, urlTemplate, urlVariables); + return new MockHttpServletRequestBuilder(HttpMethod.PUT, urlTemplate, urlVariables); } /** * Create a {@link MockHttpServletRequestBuilder} for a DELETE request. * - * @param urlTemplate a URI template including any component (e.g. scheme, host, query) - * @param urlVariables zero or more URI variables + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ public static MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) { - return request(HttpMethod.DELETE, urlTemplate, urlVariables); + return new MockHttpServletRequestBuilder(HttpMethod.DELETE, urlTemplate, urlVariables); } /** * Create a {@link MockHttpServletRequestBuilder} for a multipart request. * - * @param urlTemplate a URI template including any component (e.g. scheme, host, query) - * @param urlVariables zero or more URI variables + * @param urlTemplate a URL template; the resulting URL will be encoded + * @param urlVariables zero or more URL variables */ public static MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables) { - URI url = expandUrl(urlTemplate, urlVariables); - return new MockMultipartHttpServletRequestBuilder(url); - } - - /** - * Create a {@link MockHttpServletRequestBuilder} for any HTTP method. - * - * @param httpMethod the HTTP method - * @param urlTemplate a URI template including any component (e.g. scheme, host, query) - * @param urlVariables zero or more URI variables - */ - private static MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables) { - URI url = expandUrl(urlTemplate, urlVariables); - return new MockHttpServletRequestBuilder(url, httpMethod); - } - - private static URI expandUrl(String urlTemplate, Object[] urlVariables) { - UriTemplate uriTemplate = new UriTemplate(urlTemplate); - return uriTemplate.expand(urlVariables); + return new MockMultipartHttpServletRequestBuilder(urlTemplate, urlVariables); } } diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchers.java b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchers.java index 29589662e84..f499ce25225 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchers.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchers.java @@ -57,14 +57,14 @@ public class ContentResultMatchers { /** * Assert the ServletResponse content type. */ - public ResultMatcher mimeType(String contentType) { - return mimeType(MediaType.parseMediaType(contentType)); + public ResultMatcher contentType(String contentType) { + return contentType(MediaType.parseMediaType(contentType)); } /** * Assert the ServletResponse content type after parsing it as a MediaType. */ - public ResultMatcher mimeType(final MediaType contentType) { + public ResultMatcher contentType(final MediaType contentType) { return new ResultMatcher() { public void match(MvcResult result) throws Exception { String actual = result.getResponse().getContentType(); diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ModelResultMatchers.java b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ModelResultMatchers.java index 6938582dca0..f47d1b39cd1 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ModelResultMatchers.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/servlet/result/ModelResultMatchers.java @@ -24,7 +24,9 @@ import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.springframework.test.web.mock.servlet.MvcResult; import org.springframework.test.web.mock.servlet.ResultMatcher; +import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; +import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; /** @@ -51,8 +53,7 @@ public class ModelResultMatchers { return new ResultMatcher() { @SuppressWarnings("unchecked") public void match(MvcResult result) throws Exception { - ModelAndView mav = result.getModelAndView(); - assertTrue("No ModelAndView found", mav != null); + ModelAndView mav = getModelAndView(result); MatcherAssert.assertThat("Model attribute '" + name + "'", (T) mav.getModel().get(name), matcher); } }; @@ -79,6 +80,20 @@ public class ModelResultMatchers { }; } + /** + * Assert the given model attribute(s) have errors. + */ + public ResultMatcher attributeErrorCount(final String name, final int expectedCount) { + return new ResultMatcher() { + public void match(MvcResult result) throws Exception { + ModelAndView mav = getModelAndView(result); + Errors errors = getBindingResult(mav, name); + assertEquals("Binding/validation error count for attribute [" + name + "], ", + expectedCount, errors.getErrorCount()); + } + }; + } + /** * Assert the given model attribute(s) have errors. */ @@ -88,7 +103,7 @@ public class ModelResultMatchers { ModelAndView mav = getModelAndView(mvcResult); for (String name : names) { BindingResult result = getBindingResult(mav, name); - assertTrue("No errors for attribute: " + name, result.hasErrors()); + assertTrue("No errors for attribute [" + name + "]", result.hasErrors()); } } }; @@ -103,7 +118,7 @@ public class ModelResultMatchers { ModelAndView mav = getModelAndView(mvcResult); for (String name : names) { BindingResult result = getBindingResult(mav, name); - assertTrue("No errors for attribute: " + name, !result.hasErrors()); + assertTrue("No errors for attribute [" + name + "]", !result.hasErrors()); } } }; @@ -117,15 +132,39 @@ public class ModelResultMatchers { public void match(MvcResult mvcResult) throws Exception { ModelAndView mav = getModelAndView(mvcResult); BindingResult result = getBindingResult(mav, name); - assertTrue("No errors for attribute: '" + name + "'", result.hasErrors()); + assertTrue("No errors for attribute: [" + name + "]", result.hasErrors()); for (final String fieldName : fieldNames) { - assertTrue("No errors for field: '" + fieldName + "' of attribute: " + name, + assertTrue("No errors for field: [" + fieldName + "] of attribute [" + name + "]", result.hasFieldErrors(fieldName)); } } }; } + /** + * Assert the total number of errors in the model. + */ + public ResultMatcher errorCount(final int expectedCount) { + return new ResultMatcher() { + public void match(MvcResult result) throws Exception { + int actualCount = getErrorCount(getModelAndView(result).getModelMap()); + assertEquals("Binding/validation error count", expectedCount, actualCount); + } + }; + } + + /** + * Assert the model has errors. + */ + public ResultMatcher hasErrors() { + return new ResultMatcher() { + public void match(MvcResult result) throws Exception { + int count = getErrorCount(getModelAndView(result).getModelMap()); + assertTrue("Expected binding/validation errors", count != 0); + } + }; + } + /** * Assert the model has no errors. */ @@ -134,8 +173,9 @@ public class ModelResultMatchers { public void match(MvcResult result) throws Exception { ModelAndView mav = getModelAndView(result); for (Object value : mav.getModel().values()) { - if (value instanceof BindingResult) { - assertTrue("Unexpected binding error(s): " + value, !((BindingResult) value).hasErrors()); + if (value instanceof Errors) { + assertTrue("Unexpected binding/validation error(s) [" + value + "]", + !((Errors) value).hasErrors()); } } } @@ -172,4 +212,14 @@ public class ModelResultMatchers { return result; } + private int getErrorCount(ModelMap model) { + int count = 0; + for (Object value : model.values()) { + if (value instanceof Errors) { + count += ((Errors) value).getErrorCount(); + } + } + return count; + } + } diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/support/XmlExpectationsHelper.java b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/support/XmlExpectationsHelper.java index 578a2a6a5c7..796b75b8bab 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/mock/support/XmlExpectationsHelper.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/mock/support/XmlExpectationsHelper.java @@ -85,6 +85,11 @@ public class XmlExpectationsHelper { * @see MockMvcResultMatchers#xpath(String, Map, Object...) */ public void assertXmlEqual(String expected, String actual) throws Exception { + + XMLUnit.setIgnoreWhitespace(true); + XMLUnit.setIgnoreComments(true); + XMLUnit.setIgnoreAttributeOrder(true); + Document control = XMLUnit.buildControlDocument(expected); Document test = XMLUnit.buildTestDocument(actual); Diff diff = new Diff(control, test); diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilderTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilderTests.java index eef87f24ca3..ca9b7d8a0da 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilderTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/request/MockHttpServletRequestBuilderTests.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import java.net.URI; import java.security.Principal; import java.util.Arrays; import java.util.Collections; @@ -40,7 +39,6 @@ import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; import org.springframework.mock.web.MockServletContext; -import org.springframework.test.web.mock.servlet.request.MockHttpServletRequestBuilder; import org.springframework.util.FileCopyUtils; import org.springframework.web.servlet.FlashMap; import org.springframework.web.servlet.support.SessionFlashMapManager; @@ -59,7 +57,7 @@ public class MockHttpServletRequestBuilderTests { @Before public void setUp() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/foo/bar"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/foo/bar"); servletContext = new MockServletContext(); } @@ -72,8 +70,8 @@ public class MockHttpServletRequestBuilderTests { @Test public void uri() throws Exception { - URI uri = new URI("https://java.sun.com:8080/javase/6/docs/api/java/util/BitSet.html?foo=bar#and(java.util.BitSet)"); - this.builder = new MockHttpServletRequestBuilder(uri, HttpMethod.GET); + String uri = "https://java.sun.com:8080/javase/6/docs/api/java/util/BitSet.html?foo=bar#and(java.util.BitSet)"; + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, uri); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); assertEquals("https", request.getScheme()); @@ -86,8 +84,8 @@ public class MockHttpServletRequestBuilderTests { } @Test - public void requestUriEncodedPath() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/foo%20bar"), HttpMethod.GET); + public void requestUriWithEncoding() throws Exception { + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/foo bar"); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); assertEquals("/foo%20bar", request.getRequestURI()); @@ -95,7 +93,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void contextPathEmpty() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/foo"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/foo"); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); @@ -106,7 +104,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void contextPathServletPathEmpty() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/travel/hotels/42"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels/42"); this.builder.contextPath("/travel"); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); @@ -118,7 +116,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void contextPathServletPath() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/travel/main/hotels/42"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/main/hotels/42"); this.builder.contextPath("/travel"); this.builder.servletPath("/main"); @@ -131,7 +129,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void contextPathServletPathInfoEmpty() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/travel/hotels/42"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/travel/hotels/42"); this.builder.contextPath("/travel"); this.builder.servletPath("/hotels/42"); @@ -145,7 +143,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void contextPathServletPathInfo() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/"); this.builder.servletPath("/index.html"); this.builder.pathInfo(null); @@ -181,7 +179,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void requestUriAndFragment() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/foo#bar"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/foo#bar"); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); assertEquals("/foo", request.getRequestURI()); @@ -199,7 +197,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void requestParameterFromQuery() throws Exception { - this.builder = new MockHttpServletRequestBuilder(new URI("/?foo=bar&foo=baz"), HttpMethod.GET); + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/?foo=bar&foo=baz"); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); Map parameterMap = request.getParameterMap(); @@ -209,13 +207,24 @@ public class MockHttpServletRequestBuilderTests { } @Test - public void requestParametersFromQuery_i18n() throws Exception { - URI uri = new URI("/?foo=I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n"); - this.builder = new MockHttpServletRequestBuilder(uri, HttpMethod.GET); + public void requestParameterFromQueryList() throws Exception { + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/?foo[0]=bar&foo[1]=baz"); + + MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); + + assertEquals("foo[0]=bar&foo[1]=baz", request.getQueryString()); + assertEquals("bar", request.getParameter("foo[0]")); + assertEquals("baz", request.getParameter("foo[1]")); + } + + @Test + public void requestParameterFromQueryWithEncoding() throws Exception { + this.builder = new MockHttpServletRequestBuilder(HttpMethod.GET, "/?foo={value}", "bar=baz"); + MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); - assertEquals("I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n", request.getParameter("foo")); - assertEquals("foo=I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n", request.getQueryString()); + assertEquals("foo=bar=baz", request.getQueryString()); + assertEquals("bar=baz", request.getParameter("foo")); } @Test @@ -247,7 +256,7 @@ public class MockHttpServletRequestBuilderTests { @Test public void body() throws Exception { byte[] body = "Hello World".getBytes("UTF-8"); - this.builder.body(body); + this.builder.content(body); MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); byte[] result = FileCopyUtils.copyToByteArray(request.getInputStream()); diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchersTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchersTests.java index 58598703cce..26cbc33f935 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchersTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/result/ContentResultMatchersTests.java @@ -29,12 +29,12 @@ public class ContentResultMatchersTests { @Test public void typeMatches() throws Exception { - new ContentResultMatchers().mimeType("application/json;charset=UTF-8").match(getStubMvcResult()); + new ContentResultMatchers().contentType("application/json;charset=UTF-8").match(getStubMvcResult()); } @Test(expected=AssertionError.class) public void typeNoMatch() throws Exception { - new ContentResultMatchers().mimeType("text/plain").match(getStubMvcResult()); + new ContentResultMatchers().contentType("text/plain").match(getStubMvcResult()); } @Test diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/context/WebAppResourceTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/context/WebAppResourceTests.java index f05ed9d6684..bea061db133 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/context/WebAppResourceTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/context/WebAppResourceTests.java @@ -68,7 +68,7 @@ public class WebAppResourceTests { @Test public void resourceRequest() throws Exception { this.mockMvc.perform(get("/resources/Spring.js")) - .andExpect(content().mimeType("text/javascript")) + .andExpect(content().contentType("text/javascript")) .andExpect(content().string(containsString("Spring={};"))); } diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/RequestParameterTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/RequestParameterTests.java index 3780c7bd1d2..8d897c886ef 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/RequestParameterTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/RequestParameterTests.java @@ -42,7 +42,7 @@ public class RequestParameterTests { standaloneSetup(new PersonController()).build() .perform(get("/search?name=George").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().mimeType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json;charset=UTF-8")) .andExpect(jsonPath("$.name").value("George")); } diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ResponseBodyTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ResponseBodyTests.java index b1017616169..3c79e4a5fe5 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ResponseBodyTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ResponseBodyTests.java @@ -41,7 +41,7 @@ public class ResponseBodyTests { standaloneSetup(new PersonController()).build() .perform(get("/person/Lee").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().mimeType("application/json;charset=UTF-8")) + .andExpect(content().contentType("application/json;charset=UTF-8")) .andExpect(jsonPath("$.name").value("Lee")); } diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ViewResolutionTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ViewResolutionTests.java index eefbcac206b..0c42cb5fbae 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ViewResolutionTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/ViewResolutionTests.java @@ -77,7 +77,7 @@ public class ViewResolutionTests { standaloneSetup(new PersonController()).setSingleView(new MappingJacksonJsonView()).build() .perform(get("/person/Corea")) .andExpect(status().isOk()) - .andExpect(content().mimeType(MediaType.APPLICATION_JSON)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.person.name").value("Corea")); } @@ -90,7 +90,7 @@ public class ViewResolutionTests { standaloneSetup(new PersonController()).setSingleView(new MarshallingView(marshaller)).build() .perform(get("/person/Corea")) .andExpect(status().isOk()) - .andExpect(content().mimeType(MediaType.APPLICATION_XML)) + .andExpect(content().contentType(MediaType.APPLICATION_XML)) .andExpect(xpath("/person/name/text()").string(equalTo("Corea"))); } @@ -125,12 +125,12 @@ public class ViewResolutionTests { mockMvc.perform(get("/person/Corea").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().mimeType(MediaType.APPLICATION_JSON)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.person.name").value("Corea")); mockMvc.perform(get("/person/Corea").accept(MediaType.APPLICATION_XML)) .andExpect(status().isOk()) - .andExpect(content().mimeType(MediaType.APPLICATION_XML)) + .andExpect(content().contentType(MediaType.APPLICATION_XML)) .andExpect(xpath("/person/name/text()").string(equalTo("Corea"))); } diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/ContentAssertionTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/ContentAssertionTests.java index 013353186b8..e5cda13db32 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/ContentAssertionTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/ContentAssertionTests.java @@ -52,12 +52,12 @@ public class ContentAssertionTests { @Test public void testContentType() throws Exception { this.mockMvc.perform(get("/handle")) - .andExpect(content().mimeType(MediaType.TEXT_PLAIN)) - .andExpect(content().mimeType("text/plain")); + .andExpect(content().contentType(MediaType.TEXT_PLAIN)) + .andExpect(content().contentType("text/plain")); this.mockMvc.perform(get("/handleUtf8")) - .andExpect(content().mimeType(MediaType.valueOf("text/plain;charset=UTF-8"))) - .andExpect(content().mimeType("text/plain;charset=UTF-8")); + .andExpect(content().contentType(MediaType.valueOf("text/plain;charset=UTF-8"))) + .andExpect(content().contentType("text/plain;charset=UTF-8")); } @Test diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/JsonPathAssertionTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/JsonPathAssertionTests.java index af6ff71ae4f..aaaac9e840f 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/JsonPathAssertionTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/JsonPathAssertionTests.java @@ -57,7 +57,7 @@ public class JsonPathAssertionTests { this.mockMvc = standaloneSetup(new MusicController()) .defaultRequest(get("/").accept(MediaType.APPLICATION_JSON)) .alwaysExpect(status().isOk()) - .alwaysExpect(content().mimeType("application/json;charset=UTF-8")) + .alwaysExpect(content().contentType("application/json;charset=UTF-8")) .build(); } diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XmlContentAssertionTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XmlContentAssertionTests.java index 302d1de7630..56fbdf76e38 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XmlContentAssertionTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XmlContentAssertionTests.java @@ -67,7 +67,7 @@ public class XmlContentAssertionTests { this.mockMvc = standaloneSetup(new MusicController()) .defaultRequest(get("/").accept(MediaType.APPLICATION_XML)) .alwaysExpect(status().isOk()) - .alwaysExpect(content().mimeType(MediaType.APPLICATION_XML)) + .alwaysExpect(content().contentType(MediaType.APPLICATION_XML)) .build(); } diff --git a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XpathAssertionTests.java b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XpathAssertionTests.java index 5175611c5b5..62157b0852d 100644 --- a/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XpathAssertionTests.java +++ b/spring-test-mvc/src/test/java/org/springframework/test/web/mock/servlet/samples/standalone/resultmatchers/XpathAssertionTests.java @@ -63,7 +63,7 @@ public class XpathAssertionTests { this.mockMvc = standaloneSetup(new MusicController()) .defaultRequest(get("/").accept(MediaType.APPLICATION_XML)) .alwaysExpect(status().isOk()) - .alwaysExpect(content().mimeType(MediaType.APPLICATION_XML)) + .alwaysExpect(content().contentType(MediaType.APPLICATION_XML)) .build(); }