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 e64a91d1..1fbc2b5f 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,7 +86,7 @@ class JsonContentHandler implements ContentHandler { } ExtractedField extracted = this.fieldProcessor.extract(candidate.getPath(), payload); - return isEmptyCollection(extracted.getValue()); + return extracted.getValue() == null || isEmptyCollection(extracted.getValue()); } private boolean isEmptyCollection(Object value) { 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 bfb6eb8f..efe6cc70 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 @@ -183,4 +183,13 @@ public class JsonContentHandlerTests { assertThat(missingFields.get(0).getPath()).isEqualTo("a.[].b.[].c"); } + @Test + public void describedMissingFieldThatIsChildOfOptionalObjectThatIsNullIsNotConsideredMissing() { + List missingFields = new JsonContentHandler( + "{\"a\":null}".getBytes()).findMissingFields( + Arrays.asList(new FieldDescriptor("a").optional(), + new FieldDescriptor("a.b"))); + assertThat(missingFields.size()).isEqualTo(0); + } + }