TwoCreators4602Test.java

package com.fasterxml.jackson.databind.deser.creators;

import java.util.List;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;

import static org.assertj.core.api.Assertions.assertThat;

// for [databind#4602]
public class TwoCreators4602Test
    extends DatabindTestUtil
{
    static class OuterBean4602 {
        private final Bean4602 bean;

        @JsonCreator
        public OuterBean4602(@JsonProperty("bean") Bean4602 bean) {
            this.bean = bean;
        }

        public Bean4602 getBean() {
            return bean;
        }
    }

    static class Bean4602 {
        private final List<String> list;

        private final InnerBean4602 inner;

        @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
        public Bean4602(@JsonProperty("list") List<String> list, @JsonProperty("inner") InnerBean4602 inner) {
            this.list = list;
            this.inner = inner;
        }

        @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
        private static Bean4602 of(final List<String> list) {
            return new Bean4602(list, new InnerBean4602("default"));
        }

        public List<String> getList() {
            return list;
        }

        public InnerBean4602 getInner() {
            return inner;
        }
    }

    static class InnerBean4602 {
        private final String name;

        @JsonCreator
        public InnerBean4602(@JsonProperty("name") String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    private final ObjectMapper MAPPER = newJsonMapper();

    @Test
    public void testThatPropertiesCreatorIsUsed() throws Exception
    {
        final String json = "{ \"bean\":{ \"list\":[ \"a\", \"b\", \"c\"], \"inner\":{ \"name\": \"inner\" }}}";

        OuterBean4602 result = MAPPER.readValue(json, OuterBean4602.class);

        assertThat(result).isNotNull();
        assertThat(result.getBean()).isNotNull();
        assertThat(result.getBean().getInner()).isNotNull();
        assertThat(result.getBean().getInner().getName()).isEqualTo("inner");
        assertThat(result.getBean().getList()).containsExactly("a", "b", "c");
    }

    @Test
    public void testThatDelegatingCreatorIsUsed() throws Exception
    {
        OuterBean4602 result = MAPPER.readValue("{ \"bean\": [ \"a\", \"b\", \"c\"] }",
                OuterBean4602.class);

        assertThat(result).isNotNull();
        assertThat(result.getBean()).isNotNull();
        assertThat(result.getBean().getInner()).isNotNull();
        assertThat(result.getBean().getInner().getName()).isEqualTo("default");
        assertThat(result.getBean().getList()).containsExactly("a", "b", "c");
    }
}