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