diff --git a/spring-test/src/main/java/org/springframework/test/util/JsonExpectationsHelper.java b/spring-test/src/main/java/org/springframework/test/util/JsonExpectationsHelper.java index a4c5ca1fcb..3fe7cb3f68 100644 --- a/spring-test/src/main/java/org/springframework/test/util/JsonExpectationsHelper.java +++ b/spring-test/src/main/java/org/springframework/test/util/JsonExpectationsHelper.java @@ -32,26 +32,71 @@ public class JsonExpectationsHelper { /** * Parse the expected and actual strings as JSON and assert the two * are "similar" - i.e. they contain the same attribute-value pairs - * regardless of order and formatting. + * regardless of formatting with a lenient checking (extensible, and non-strict + * array ordering). * * @param expected the expected JSON content * @param actual the actual JSON content * @since 4.1 + * @see #assertJsonEqual(String, String, boolean) */ public void assertJsonEqual(String expected, String actual) throws Exception { - JSONAssert.assertEquals(expected, actual, false); + assertJsonEqual(expected, actual, false); + } + + /** + * Parse the expected and actual strings as JSON and assert the two + * are "similar" - i.e. they contain the same attribute-value pairs + * regardless of formatting. + * + *
Can compare in two modes, depending on {@code strict} parameter value: + *
Can compare in two modes, depending on {@code strict} parameter value: + *
Use of this matcher requires the JSONassert library. + * Parse the expected and actual strings as JSON and assert the two + * are "similar" - i.e. they contain the same attribute-value pairs + * regardless of formatting with a lenient checking (extensible, and non-strict array + * ordering). + * * @param jsonContent the expected JSON content * @since 4.1 */ public ResultMatcher json(final String jsonContent) { + return json(jsonContent, false); + } + + /** + * Parse the response content and the given string as JSON and assert the two + * are "similar" - i.e. they contain the same attribute-value pairs + * regardless of formatting. + * + *
Can compare in two modes, depending on {@code strict} parameter value: + *
Use of this matcher requires the JSONassert library. + * + * @param jsonContent the expected JSON content + * @param strict enables strict checking + * @since 4.2 + */ + public ResultMatcher json(final String jsonContent, final boolean strict) { return new ResultMatcher() { @Override public void match(MvcResult result) throws Exception { String content = result.getResponse().getContentAsString(); - jsonHelper.assertJsonEqual(jsonContent, content); + jsonHelper.assertJsonEqual(jsonContent, content, strict); } }; } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/result/ContentResultMatchersTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/result/ContentResultMatchersTests.java index 528b4376b1..db1baee851 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/result/ContentResultMatchersTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/result/ContentResultMatchersTests.java @@ -79,17 +79,28 @@ public class ContentResultMatchersTests { } @Test - public void json() throws Exception { - new ContentResultMatchers().json("{\n \"foo\" : \"bar\" \n}").match(getStubMvcResult()); + public void jsonLenientMatch() throws Exception { + new ContentResultMatchers().json("{\n \"foo\" : \"bar\" \n}").match(getStubMvcResult()); + new ContentResultMatchers().json("{\n \"foo\" : \"bar\" \n}", false).match(getStubMvcResult()); + } + + @Test + public void jsonStrictMatch() throws Exception { + new ContentResultMatchers().json("{\n \"foo\":\"bar\", \"foo array\":[\"foo\",\"bar\"] \n}", true).match(getStubMvcResult()); + new ContentResultMatchers().json("{\n \"foo array\":[\"foo\",\"bar\"], \"foo\":\"bar\" \n}", true).match(getStubMvcResult()); } @Test(expected=AssertionError.class) - public void jsonNoMatch() throws Exception { + public void jsonLenientNoMatch() throws Exception { new ContentResultMatchers().json("{\n\"fooo\":\"bar\"\n}").match(getStubMvcResult()); } + @Test(expected=AssertionError.class) + public void jsonStrictNoMatch() throws Exception { + new ContentResultMatchers().json("{\"foo\":\"bar\", \"foo array\":[\"bar\",\"foo\"]}", true).match(getStubMvcResult()); + } - private static final String CONTENT = "{\"foo\":\"bar\"}"; + private static final String CONTENT = "{\"foo\":\"bar\",\"foo array\":[\"foo\",\"bar\"]}"; private StubMvcResult getStubMvcResult() throws Exception { MockHttpServletResponse response = new MockHttpServletResponse();