From 482adb94786b2166091675daf8e42e61e50ca8be Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 1 Aug 2020 16:35:54 +0200 Subject: [PATCH] Fix error message for type mismatch in jsonPath().value() Prior to this commit, if a value existed at the specified JSON path but had an incompatible type, the AssertionError thrown contained a message stating that the value did not exist (i.e., "No Value at JSON Path"), which was not only misleading but also technically incorrect. This commit fixes the error message for such use cases. For example, the AssertionError thrown in such use cases now resembles the following. At JSON path "$.name", value of type cannot be converted to type Closes gh-25480 --- .../test/util/JsonPathExpectationsHelper.java | 15 ++++++++++++--- .../result/JsonPathResultMatchersTests.java | 14 +++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) 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