diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java index 4187b514..a3c4d47d 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/payload/JsonContentHandler.java @@ -86,8 +86,23 @@ class JsonContentHandler implements ContentHandler { } ExtractedField extracted = this.fieldProcessor.extract(candidate.getPath(), payload); - return extracted.getValue() instanceof Collection - && ((Collection) extracted.getValue()).isEmpty(); + return isEmptyCollection(extracted.getValue()); + } + + private boolean isEmptyCollection(Object value) { + if (!(value instanceof Collection)) { + return false; + } + Collection collection = (Collection) value; + if (collection.isEmpty()) { + return true; + } + for (Object entry : collection) { + if (!isEmptyCollection(entry)) { + return false; + } + } + return true; } @Override diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java index ad1d4463..4040300a 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/payload/JsonContentHandlerTests.java @@ -158,7 +158,7 @@ public class JsonContentHandlerTests { } @Test - public void describedFieldThatIsSometimesPresentChildOfOptionalArrayIsNotConsideredMissing() { + public void describedSometimesPresentFieldThatIsChildOfSometimesPresentOptionalArrayIsNotConsideredMissing() { List missingFields = new JsonContentHandler( "{\"a\":[ {\"b\": \"bravo\"}, {\"b\": \"bravo\", \"c\": { \"d\": \"delta\"}}]}" .getBytes()).findMissingFields( @@ -167,4 +167,25 @@ public class JsonContentHandlerTests { assertThat(missingFields.size(), is(equalTo(0))); } + @Test + public void describedMissingFieldThatIsChildOfNestedOptionalArrayThatIsEmptyIsNotConsideredMissing() { + List missingFields = new JsonContentHandler( + "{\"a\":[{\"b\":[]}]}".getBytes()).findMissingFields( + Arrays.asList(new FieldDescriptor("a.[].b").optional(), + new FieldDescriptor("a.[].b.[]").optional(), + new FieldDescriptor("a.[].b.[].c"))); + assertThat(missingFields.size(), is(equalTo(0))); + } + + @Test + public void describedMissingFieldThatIsChildOfNestedOptionalArrayThatContainsAnObjectIsConsideredMissing() { + List missingFields = new JsonContentHandler( + "{\"a\":[{\"b\":[{}]}]}".getBytes()).findMissingFields( + Arrays.asList(new FieldDescriptor("a.[].b").optional(), + new FieldDescriptor("a.[].b.[]").optional(), + new FieldDescriptor("a.[].b.[].c"))); + assertThat(missingFields.size(), is(equalTo(1))); + assertThat(missingFields.get(0).getPath(), is(equalTo("a.[].b.[].c"))); + } + }