diff --git a/src/test/java/tools/jackson/databind/records/RecordWithOptionalParamTest.java b/src/test/java/tools/jackson/databind/records/RecordWithOptionalParamTest.java new file mode 100644 index 0000000000..eb55e437d7 --- /dev/null +++ b/src/test/java/tools/jackson/databind/records/RecordWithOptionalParamTest.java @@ -0,0 +1,67 @@ +package tools.jackson.databind.records; + +import java.util.Optional; + +import org.junit.jupiter.api.Test; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.testutil.DatabindTestUtil; +import tools.jackson.databind.testutil.failure.JacksonTestFailureExpected; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; + +// [databind#5335] When deserializing records, java.util.Optional parameters should be not be +// deserialized as null (Optional.empty() should be used instead) +public class RecordWithOptionalParamTest + extends DatabindTestUtil +{ + record RecordWithOptionalParam(String name, Optional optional) { } + + private final ObjectMapper MAPPER = newJsonMapper(); + + @Test + void serialize() throws Exception + { + RecordWithOptionalParam input = new RecordWithOptionalParam("v1", Optional.of("v2")); + assertEquals(a2q("{'name':'v1','optional':'v2'}"), + MAPPER.writeValueAsString(input)); + } + + @Test + void serializeEmpty() throws Exception + { + RecordWithOptionalParam input = new RecordWithOptionalParam("v1", Optional.empty()); + assertEquals(a2q("{'name':'v1','optional':null}"), + MAPPER.writeValueAsString(input)); + } + + @Test + void deserializeNonEmpty() throws Exception + { + String json = a2q("{'name':'v1','optional':'v2'}"); + RecordWithOptionalParam output = MAPPER.readValue(json, RecordWithOptionalParam.class); + assertEquals("v1", output.name()); + assertEquals(Optional.of("v2"), output.optional()); + } + + @Test + void deserializeExplicitNull() throws Exception + { + String json = a2q("{'name':'v1','optional':null}"); + RecordWithOptionalParam output = MAPPER.readValue(json, RecordWithOptionalParam.class); + assertEquals("v1", output.name()); + assertNotNull(output.optional()); + assertEquals(Optional.empty(), output.optional()); + } + + @JacksonTestFailureExpected // [databind#5335] + @Test + void deserializeMissing() throws Exception + { + RecordWithOptionalParam output = MAPPER.readValue(a2q("{'name':'v1'}"), + RecordWithOptionalParam.class); + assertEquals("v1", output.name()); + assertNotNull(output.optional()); + assertEquals(Optional.empty(), output.optional()); + } +}