BeanDeserializerModifier4216Test.java

package tools.jackson.databind.deser.bean;

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.jupiter.api.Test;

import tools.jackson.databind.*;
import tools.jackson.databind.deser.ValueDeserializerModifier;
import tools.jackson.databind.module.SimpleModule;
import tools.jackson.databind.testutil.DatabindTestUtil;
import tools.jackson.databind.type.ArrayType;

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

/**
 * Unit test for [databind#4216] : Primitive array deserializer cannot being captured by DeserializerModifier
 */
public class BeanDeserializerModifier4216Test extends DatabindTestUtil
{
    static class WrapperBean4216 {
        public Byte[] objArr;
        public byte[] primArr;
    }

    @Test
    public void testModifierCalledTwice() throws Exception
    {
        // Given : Configure and construct
        AtomicInteger counter = new AtomicInteger(0);
        ObjectMapper objectMapper = jsonMapperBuilder()
                .addModules(getSimpleModuleWithCounter(counter))
                .build();

        // Given : Set-up data
        WrapperBean4216 test = new WrapperBean4216();
        test.primArr = new byte[]{(byte) 0x11};
        test.objArr = new Byte[]{(byte) 0x11};
        String sample = objectMapper.writeValueAsString(test);

        // When
        objectMapper.readValue(sample, WrapperBean4216.class);

        // Then : modifyArrayDeserializer should be called twice
        assertEquals(2, counter.get());
    }

    private static SimpleModule getSimpleModuleWithCounter(AtomicInteger counter) {
        SimpleModule module = new SimpleModule();
        module.setDeserializerModifier(
            new ValueDeserializerModifier() {
                private static final long serialVersionUID = 1L;

                @Override
                public ValueDeserializer<?> modifyArrayDeserializer(DeserializationConfig config,
                        ArrayType valueType, BeanDescription.Supplier beanDescRef,
                        ValueDeserializer<?> deserializer)
                {
                    // Count invocations
                    counter.incrementAndGet();
                    return deserializer;
                }
        });
        return module;
    }
}