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 c034a0e0..2978dd56 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 @@ -81,6 +81,9 @@ class JsonContentHandler implements ContentHandler { } private boolean isMissing(FieldDescriptor candidate, Object payload) { + if (!this.fieldProcessor.hasField(candidate.getPath(), payload)) { + return true; + } try { ExtractedField extracted = this.fieldProcessor.extract(candidate.getPath(), payload); 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 41bc05bb..91c1ff73 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 @@ -157,4 +157,14 @@ public class JsonContentHandlerTests { assertThat(missingFields.size(), is(equalTo(0))); } + @Test + public void describedFieldThatIsSometimesPresentChildOfOptionalArrayIsNotConsideredMissing() { + List missingFields = new JsonContentHandler( + "{\"a\":[ {\"b\": \"bravo\"}, {\"b\": \"bravo\", \"c\": { \"d\": \"delta\"}}]}" + .getBytes()).findMissingFields( + Arrays.asList(new FieldDescriptor("a.[].c").optional(), + new FieldDescriptor("a.[].c.d]"))); + assertThat(missingFields.size(), is(equalTo(0))); + } + }