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 309c541b33a..5b657a20dfd 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -282,21 +282,21 @@ public class JsonPathExpectationsHelper { @Nullable private Object evaluateJsonPath(String content) { - String message = "No value at JSON path \"" + this.expression + "\""; try { return this.jsonPath.read(content); } catch (Throwable ex) { + String message = "No value at JSON path \"" + this.expression + "\""; throw new AssertionError(message, ex); } } private Object evaluateJsonPath(String content, Class targetType) { - String message = "No value at JSON path \"" + this.expression + "\""; try { return JsonPath.parse(content).read(this.expression, targetType); } catch (Throwable ex) { + String message = "No value at JSON path \"" + this.expression + "\""; throw new AssertionError(message, ex); } } diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/JsonPathRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/JsonPathRequestMatchers.java index 71f9c1b7201..bc5a75b7bfb 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/JsonPathRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/JsonPathRequestMatchers.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 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. @@ -30,6 +30,7 @@ import org.springframework.test.web.client.RequestMatcher; /** * Factory for assertions on the request content using * JsonPath expressions. + * *

An instance of this class is typically accessed via * {@link MockRestRequestMatchers#jsonPath(String, Matcher)} or * {@link MockRestRequestMatchers#jsonPath(String, Object...)}. @@ -70,10 +71,11 @@ public class JsonPathRequestMatchers { } /** - * An overloaded variant of (@link {@link #value(Matcher)} that also - * accepts a target type for the resulting value that the matcher can work - * reliably against. This can be useful for matching numbers reliably for - * example coercing an integer into a double. + * An overloaded variant of {@link #value(Matcher)} that also accepts a + * target type for the resulting value that the matcher can work reliably + * against. + *

This can be useful for matching numbers reliably — for example, + * to coerce an integer into a double. * @since 4.3.3 */ public RequestMatcher value(final Matcher matcher, final Class targetType) { diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java index 3a2c739bfd0..d496241fbec 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java @@ -199,7 +199,7 @@ public abstract class MockRestRequestMatchers { * @param expression the JSON path optionally parameterized with arguments * @param args arguments to parameterize the JSON path expression with */ - public static JsonPathRequestMatchers jsonPath(String expression, Object ... args) { + public static JsonPathRequestMatchers jsonPath(String expression, Object... args) { return new JsonPathRequestMatchers(expression, args); } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/result/JsonPathResultMatchers.java b/spring-test/src/main/java/org/springframework/test/web/servlet/result/JsonPathResultMatchers.java index 76797c81fd5..21993441f00 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/result/JsonPathResultMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/result/JsonPathResultMatchers.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -80,19 +80,40 @@ public class JsonPathResultMatchers { /** * Evaluate the JSON path expression against the response content and * assert the resulting value with the given Hamcrest {@link Matcher}. + * @see #value(Matcher, Class) + * @see #value(Object) */ - public ResultMatcher value(final Matcher matcher) { + public ResultMatcher value(Matcher matcher) { return result -> { String content = getContent(result); jsonPathHelper.assertValue(content, matcher); }; } + /** + * An overloaded variant of {@link #value(Matcher)} that also accepts a + * target type for the resulting value that the matcher can work reliably + * against. + *

This can be useful for matching numbers reliably — for example, + * to coerce an integer into a double. + * @since 4.3.15 + * @see #value(Matcher) + * @see #value(Object) + */ + public ResultMatcher value(Matcher matcher, Class targetType) { + return result -> { + String content = getContent(result); + jsonPathHelper.assertValue(content, matcher, targetType); + }; + } + /** * Evaluate the JSON path expression against the response content and * assert that the result is equal to the supplied value. + * @see #value(Matcher) + * @see #value(Matcher, Class) */ - public ResultMatcher value(final Object expectedValue) { + public ResultMatcher value(Object expectedValue) { return result -> jsonPathHelper.assertValue(getContent(result), expectedValue); } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java b/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java index e364d868444..fd0b1f86016 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -186,7 +186,7 @@ public abstract class MockMvcResultMatchers { * @param expression the JSON path expression, optionally parameterized with arguments * @param args arguments to parameterize the JSON path expression with */ - public static JsonPathResultMatchers jsonPath(String expression, Object ... args) { + public static JsonPathResultMatchers jsonPath(String expression, Object... args) { return new JsonPathResultMatchers(expression, args); } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/match/JsonPathRequestMatchersTests.java b/spring-test/src/test/java/org/springframework/test/web/client/match/JsonPathRequestMatchersTests.java index 0b2069b19fb..781e86680c3 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/match/JsonPathRequestMatchersTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/match/JsonPathRequestMatchersTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2018 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. @@ -18,6 +18,8 @@ package org.springframework.test.web.client.match; import java.io.IOException; +import org.hamcrest.Matchers; + import org.junit.Test; import org.springframework.mock.http.client.MockClientHttpRequest; @@ -55,14 +57,19 @@ public class JsonPathRequestMatchersTests { } + @Test(expected = AssertionError.class) + public void valueWithMismatch() throws Exception { + new JsonPathRequestMatchers("$.str").value("bogus").match(request); + } + @Test - public void value() throws Exception { + public void valueWithDirectMatch() throws Exception { new JsonPathRequestMatchers("$.str").value("foo").match(request); } - @Test(expected = AssertionError.class) - public void valueNoMatch() throws Exception { - new JsonPathRequestMatchers("$.str").value("bogus").match(request); + @Test // SPR-14498 + public void valueWithNumberConversion() throws Exception { + new JsonPathRequestMatchers("$.num").value(5.0f).match(request); } @Test @@ -70,8 +77,13 @@ public class JsonPathRequestMatchersTests { new JsonPathRequestMatchers("$.str").value(equalTo("foo")).match(request); } + @Test // SPR-14498 + public void valueWithMatcherAndNumberConversion() throws Exception { + new JsonPathRequestMatchers("$.num").value(Matchers.equalTo(5.0f), Float.class).match(request); + } + @Test(expected = AssertionError.class) - public void valueWithMatcherNoMatch() throws Exception { + public void valueWithMatcherAndMismatch() throws Exception { new JsonPathRequestMatchers("$.str").value(equalTo("bogus")).match(request); } 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 b587a34e5c2..832981c7ca3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 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. @@ -58,14 +58,19 @@ public class JsonPathResultMatchersTests { } } + @Test(expected = AssertionError.class) + public void valueWithMismatch() throws Exception { + new JsonPathResultMatchers("$.str").value("bogus").match(stubMvcResult); + } + @Test - public void value() throws Exception { + public void valueWithDirectMatch() throws Exception { new JsonPathResultMatchers("$.str").value("foo").match(stubMvcResult); } - @Test(expected = AssertionError.class) - public void valueNoMatch() throws Exception { - new JsonPathResultMatchers("$.str").value("bogus").match(stubMvcResult); + @Test // SPR-16587 + public void valueWithNumberConversion() throws Exception { + new JsonPathResultMatchers("$.num").value(5.0f).match(stubMvcResult); } @Test @@ -73,8 +78,13 @@ public class JsonPathResultMatchersTests { new JsonPathResultMatchers("$.str").value(Matchers.equalTo("foo")).match(stubMvcResult); } + @Test // SPR-16587 + public void valueWithMatcherAndNumberConversion() throws Exception { + new JsonPathResultMatchers("$.num").value(Matchers.equalTo(5.0f), Float.class).match(stubMvcResult); + } + @Test(expected = AssertionError.class) - public void valueWithMatcherNoMatch() throws Exception { + public void valueWithMatcherAndMismatch() throws Exception { new JsonPathResultMatchers("$.str").value(Matchers.equalTo("bogus")).match(stubMvcResult); }