diff --git a/spring-test/src/main/java/org/springframework/test/util/JsonPathExpectationsHelper.java b/spring-test/src/main/java/org/springframework/test/util/JsonPathExpectationsHelper.java index 7a9ee1faaf..af43cb787e 100644 --- a/spring-test/src/main/java/org/springframework/test/util/JsonPathExpectationsHelper.java +++ b/spring-test/src/main/java/org/springframework/test/util/JsonPathExpectationsHelper.java @@ -26,6 +26,7 @@ import org.hamcrest.MatcherAssert; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -108,10 +109,18 @@ public class JsonPathExpectationsHelper { } actualValue = actualValueList.get(0); } - else if (actualValue != null && expectedValue != null) { - if (!actualValue.getClass().equals(expectedValue.getClass())) { + else if (actualValue != null && expectedValue != null && + !actualValue.getClass().equals(expectedValue.getClass())) { + try { actualValue = evaluateJsonPath(content, expectedValue.getClass()); } + catch (AssertionError error) { + String message = String.format( + "At JSON path \"%s\", value <%s> of type <%s> cannot be converted to type <%s>", + this.expression, actualValue, ClassUtils.getDescriptiveType(actualValue), + ClassUtils.getDescriptiveType(expectedValue)); + throw new AssertionError(message, error.getCause()); + } } AssertionErrors.assertEquals("JSON path \"" + this.expression + "\"", expectedValue, actualValue); } @@ -298,7 +307,7 @@ public class JsonPathExpectationsHelper { /** * Variant of {@link #evaluateJsonPath(String)} with a target type. - * This can be useful for matching numbers reliably for example coercing an + *

This can be useful for matching numbers reliably for example coercing an * integer into a double. * @param content the content to evaluate against * @return the result of the evaluation diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/result/JsonPathResultMatchersTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/result/JsonPathResultMatchersTests.java index 787d0a7632..3fd1bfbcce 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/result/JsonPathResultMatchersTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/result/JsonPathResultMatchersTests.java @@ -64,9 +64,17 @@ public class JsonPathResultMatchersTests { } @Test - public void valueWithMismatch() throws Exception { - assertThatExceptionOfType(AssertionError.class).isThrownBy(() -> - new JsonPathResultMatchers("$.str").value("bogus").match(stubMvcResult)); + public void valueWithValueMismatch() throws Exception { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> new JsonPathResultMatchers("$.str").value("bogus").match(stubMvcResult)) + .withMessage("JSON path \"$.str\" expected: but was:"); + } + + @Test + public void valueWithTypeMismatch() throws Exception { + assertThatExceptionOfType(AssertionError.class) + .isThrownBy(() -> new JsonPathResultMatchers("$.str").value("bogus".getBytes()).match(stubMvcResult)) + .withMessage("At JSON path \"$.str\", value of type cannot be converted to type "); } @Test