SubclassedThrowableDeserialization4827Test.java

package com.fasterxml.jackson.databind.exc;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;

import static org.junit.jupiter.api.Assertions.assertEquals;

// [databind#4827] Subclassed Throwable deserialization fails since v2.18.0
// no creator index for property 'cause'
public class SubclassedThrowableDeserialization4827Test
        extends DatabindTestUtil
{
    @SuppressWarnings("serial")
    public static class SubclassedExceptionJava extends Exception {
        @JsonCreator
        public SubclassedExceptionJava(
                @JsonProperty("message") String message,
                @JsonProperty("cause") Throwable cause
        ) {
            super(message, cause);
        }
    }

    private final ObjectMapper MAPPER = jsonMapperBuilder()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .build();

    @Test
    public void testDeserialization()
            throws Exception
    {
        // Given input
        SubclassedExceptionJava input = new SubclassedExceptionJava(
                "Test Message", new RuntimeException("test runtime cause"));

        // When serialize, then deserialize, round-trip
        String serialized = MAPPER.writeValueAsString(input);
        SubclassedExceptionJava deserialized = MAPPER.readValue(serialized, SubclassedExceptionJava.class);

        // Contents are same
        assertEquals(input.getMessage(), deserialized.getMessage());
        assertEquals(input.getCause().getMessage(), deserialized.getCause().getMessage());
    }
}