From 9e52004222addfe6498ed9eb6d8d8ad926ce21ea Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Mon, 30 Jun 2014 12:27:54 +0200 Subject: [PATCH] Add support for asserting JSON Based on the JSONassert library. Issue: SPR-10113 --- build.gradle | 1 + .../test/util/JsonExpectationsHelper.java | 57 +++++++++++++++++++ .../servlet/result/ContentResultMatchers.java | 28 ++++++++- .../result/ContentResultMatchersTests.java | 13 ++++- 4 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 spring-test/src/main/java/org/springframework/test/util/JsonExpectationsHelper.java diff --git a/build.gradle b/build.gradle index 19601016f2..f5646bc1da 100644 --- a/build.gradle +++ b/build.gradle @@ -906,6 +906,7 @@ project("spring-test") { optional("org.aspectj:aspectjweaver:${aspectjVersion}") optional("org.hamcrest:hamcrest-core:1.3") optional("com.jayway.jsonpath:json-path:0.9.0") + optional("org.skyscreamer:jsonassert:1.2.3") optional("xmlunit:xmlunit:1.5") testCompile(project(":spring-context-support")) testCompile(project(":spring-oxm")) 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 new file mode 100644 index 0000000000..a4c5ca1fcb --- /dev/null +++ b/spring-test/src/main/java/org/springframework/test/util/JsonExpectationsHelper.java @@ -0,0 +1,57 @@ +/* + * Copyright 2002-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.test.util; + +import org.skyscreamer.jsonassert.JSONAssert; + +/** + * A helper class for assertions on JSON content. + * + *

Use of this class requires the JSONassert library. + * + * @author Sebastien Deleuze + * @since 4.1 + */ +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. + * + * @param expected the expected JSON content + * @param actual the actual JSON content + * @since 4.1 + */ + public void assertJsonEqual(String expected, String actual) throws Exception { + JSONAssert.assertEquals(expected, actual, false); + } + + /** + * Parse the expected and actual strings as JSON and assert the two + * are "not similar" - i.e. they contain different attribute-value pairs + * regardless of order and formatting. + * + * @param expected the expected JSON content + * @param actual the actual JSON content + * @since 4.1 + */ + public void assertJsonNotEqual(String expected, String actual) throws Exception { + JSONAssert.assertNotEquals(expected, actual, false); + } +} diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/result/ContentResultMatchers.java b/spring-test/src/main/java/org/springframework/test/web/servlet/result/ContentResultMatchers.java index c63209f551..9c736fc400 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/result/ContentResultMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/result/ContentResultMatchers.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import javax.xml.transform.dom.DOMSource; import org.hamcrest.Matcher; import org.springframework.http.MediaType; +import org.springframework.test.util.JsonExpectationsHelper; import org.springframework.test.util.XmlExpectationsHelper; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultMatcher; @@ -44,6 +45,8 @@ public class ContentResultMatchers { private final XmlExpectationsHelper xmlHelper; + private final JsonExpectationsHelper jsonHelper; + /** * Protected constructor. @@ -51,6 +54,7 @@ public class ContentResultMatchers { */ protected ContentResultMatchers() { this.xmlHelper = new XmlExpectationsHelper(); + this.jsonHelper = new JsonExpectationsHelper(); } /** @@ -210,4 +214,26 @@ public class ContentResultMatchers { }; } + /** + * 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 order and formatting. + * + *

Use of this matcher requires the JSONassert library. + * + * @param jsonContent the expected JSON content + * @since 4.1 + */ + public ResultMatcher json(final String jsonContent) { + return new ResultMatcher() { + + @Override + public void match(MvcResult result) throws Exception { + String content = result.getResponse().getContentAsString(); + jsonHelper.assertJsonEqual(jsonContent, content); + } + }; + } + } 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 9a1bac3fdc..b2ca14346f 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import org.hamcrest.Matchers; import org.junit.Test; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.StubMvcResult; -import org.springframework.test.web.servlet.result.ContentResultMatchers; /** * @author Rossen Stoyanchev @@ -78,6 +77,16 @@ public class ContentResultMatchersTests { new ContentResultMatchers().bytes("bogus".getBytes()).match(getStubMvcResult()); } + @Test + public void json() throws Exception { + new ContentResultMatchers().json("{\n \"foo\" : \"bar\" \n}").match(getStubMvcResult()); + } + + @Test(expected=AssertionError.class) + public void jsonNoMatch() throws Exception { + new ContentResultMatchers().json("{\n\"fooo\":\"bar\"\n}").match(getStubMvcResult()); + } + private static final String CONTENT = "{\"foo\":\"bar\"}";