BeanDeserializerModifier4216Test.java

package com.fasterxml.jackson.databind.deser;

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import com.fasterxml.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 BeanDeserializerModifier() {
                private static final long serialVersionUID = 1L;

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