diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java b/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java index ece99b233c57..fb7b8a6882d6 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java @@ -40,9 +40,12 @@ import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.test.json.AbstractJsonContentAssert; import org.springframework.test.json.JsonAssert; import org.springframework.test.json.JsonComparator; import org.springframework.test.json.JsonCompareMode; +import org.springframework.test.json.JsonContent; +import org.springframework.test.json.JsonContentAssert; import org.springframework.test.util.AssertionErrors; import org.springframework.test.util.ExceptionCollector; import org.springframework.test.util.XmlExpectationsHelper; @@ -490,6 +493,15 @@ public BodyContentSpec consumeWith(Consumer> consum return this; } + @Override + public BodyContentSpec consumeWithJsonAssert(Consumer> jsonAssertConsumer) { + this.result.assertWithDiagnostics(() -> { + JsonContentAssert jsonContentAssert = new JsonContent(getBodyAsString()).assertThat(); + jsonAssertConsumer.accept(jsonContentAssert); + }); + return this; + } + @Override public EntityExchangeResult returnResult() { return this.result; diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/client/RestTestClient.java b/spring-test/src/main/java/org/springframework/test/web/servlet/client/RestTestClient.java index f1de99fd43e9..025192f669a8 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/client/RestTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/client/RestTestClient.java @@ -34,6 +34,7 @@ import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.converter.HttpMessageConverters; +import org.springframework.test.json.AbstractJsonContentAssert; import org.springframework.test.json.JsonComparator; import org.springframework.test.json.JsonCompareMode; import org.springframework.test.json.JsonComparison; @@ -810,6 +811,27 @@ default XpathAssertions xpath(String expression, Object... args) { */ BodyContentSpec consumeWith(Consumer> consumer); + /** + * Assert the response body content with the given {@link Consumer}. + * This consumer provides a {@link AbstractJsonContentAssert} that supports + * making fine-grained assertions about the JSON response body, e.g. + *
+		 * {@code
+		 * restTestClient.get().uri("/test")
+		 *     .exchangeSuccessfully()
+		 *     .expectBody()
+		 *     .consumeWithJsonAssert(jsonContentAssert -> {
+		 *	       jsonContentAssert.extractingPath("$.users")
+		 *		       .asArray().singleElement()
+		 *			   .extracting("id", "name", "email")
+		 *			   .containsExactly(123, "John Doe", "john@example.com");
+		 *	   });
+		 * }
+		 * 
+ * @param jsonAssertConsumer the consumer for the response body + */ + BodyContentSpec consumeWithJsonAssert(Consumer> jsonAssertConsumer); + /** * Exit the chained API and return an {@code ExchangeResult} with the * raw response content. diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/client/RestTestClientTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/client/RestTestClientTests.java index ee1393c16b15..cfd885699689 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/client/RestTestClientTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/client/RestTestClientTests.java @@ -287,6 +287,19 @@ void testExpectCookie() { .exchange() .expectCookie().value("session", Matchers.equalTo("abc")); } + + @Test + void testConsumeWithJsonAssert() { + var bodyContentSpec = RestTestClientTests.this.client.get().uri("/test") + .exchangeSuccessfully() + .expectBody() + .consumeWithJsonAssert(jsonContentAssert -> jsonContentAssert + .hasPath("method") + .hasPathSatisfying("uri", uri -> assertThat(uri).isEqualTo("/test")) + .extractingPath("headers").asMap().hasSize(2) + ); + assertThat(bodyContentSpec).isNotNull(); + } }