HONEYCOMB-116: generic merge test for reader customizers
authorMarek Gradzki <mgradzki@cisco.com>
Mon, 26 Sep 2016 06:20:34 +0000 (08:20 +0200)
committerMarek Gradzki <mgradzki@cisco.com>
Mon, 26 Sep 2016 06:20:34 +0000 (08:20 +0200)
Change-Id: I5c2505e6b3bcf622312f8dc324912507f6519a5b
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
16 files changed:
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/AclCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/GreCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/InterfaceCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/L2CustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/RewriteCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/SubInterfaceCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/VxlanCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/VxlanGpeCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/interfacesstate/ip/Ipv4AddressCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionReaderTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableReaderTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/vppstate/BridgeDomainCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/vppstate/L2FibEntryCustomizerTest.java
v3po/v3po2vpp/src/test/java/io/fd/honeycomb/translate/v3po/vppstate/VersionCustomizerTest.java
vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/ListReaderCustomizerTest.java
vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/ReaderCustomizerTest.java

index 00daddd..8977a74 100644 (file)
@@ -54,7 +54,7 @@ public class AclCustomizerTest extends ReaderCustomizerTest<Acl, AclBuilder> {
     private VppClassifierContextManager classifyTableContext;
 
     public AclCustomizerTest() {
-        super(Acl.class);
+        super(Acl.class, VppInterfaceStateAugmentationBuilder.class);
     }
 
     @Override
@@ -68,14 +68,6 @@ public class AclCustomizerTest extends ReaderCustomizerTest<Acl, AclBuilder> {
         return new AclCustomizer(api, interfaceContext, classifyTableContext);
     }
 
-    @Test
-    public void testMerge() {
-        final VppInterfaceStateAugmentationBuilder builder = mock(VppInterfaceStateAugmentationBuilder.class);
-        final Acl value = mock(Acl.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setAcl(value);
-    }
-
     private InstanceIdentifier<Acl> getAclId(final String name) {
         return InstanceIdentifier.create(InterfacesState.class).child(Interface.class, new InterfaceKey(name))
             .augmentation(
index e62edad..519236c 100644 (file)
@@ -37,6 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Gre;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.GreBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -58,7 +59,7 @@ public class GreCustomizerTest extends ReaderCustomizerTest<Gre, GreBuilder> {
             .augmentation(VppInterfaceStateAugmentation.class).child(Gre.class);
 
     public GreCustomizerTest() {
-        super(Gre.class);
+        super(Gre.class, VppInterfaceStateAugmentationBuilder.class);
     }
 
     @Override
index 94dfd07..a10468e 100644 (file)
@@ -63,7 +63,7 @@ public class InterfaceCustomizerTest extends
     private DisabledInterfacesManager interfaceDisableContext;
 
     public InterfaceCustomizerTest() {
-        super(Interface.class);
+        super(Interface.class, InterfacesStateBuilder.class);
     }
 
     @Override
@@ -79,15 +79,7 @@ public class InterfaceCustomizerTest extends
         return new InterfaceCustomizer(api, interfacesContext, interfaceDisableContext);
     }
 
-    @Test
-    public void testMerge() throws Exception {
-        final InterfacesStateBuilder builder = mock(InterfacesStateBuilder.class);
-        final List<Interface> value = Collections.emptyList();
-        getCustomizer().merge(builder, value);
-        verify(builder).setInterface(value);
-    }
-
-    public void whenSwInterfaceDumpThenReturn(final List<SwInterfaceDetails> interfaceList) {
+    private void whenSwInterfaceDumpThenReturn(final List<SwInterfaceDetails> interfaceList) {
         final SwInterfaceDetailsReplyDump reply = new SwInterfaceDetailsReplyDump();
         reply.swInterfaceDetails = interfaceList;
         when(api.swInterfaceDump(any(SwInterfaceDump.class))).thenReturn(future(reply));
index 6be759b..5583ae3 100644 (file)
@@ -53,7 +53,7 @@ public class L2CustomizerTest extends ReaderCustomizerTest<L2, L2Builder> {
     private NamingContext bridgeDomainContext;
 
     public L2CustomizerTest() {
-        super(L2.class);
+        super(L2.class, VppInterfaceStateAugmentationBuilder.class);
     }
 
     @Override
@@ -67,14 +67,6 @@ public class L2CustomizerTest extends ReaderCustomizerTest<L2, L2Builder> {
         return new L2Customizer(api, interfaceContext, bridgeDomainContext);
     }
 
-    @Test
-    public void testMerge() {
-        final VppInterfaceStateAugmentationBuilder builder = mock(VppInterfaceStateAugmentationBuilder.class);
-        final L2 value = mock(L2.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setL2(value);
-    }
-
     private InstanceIdentifier<L2> getL2Id(final String name) {
         return InstanceIdentifier.create(InterfacesState.class).child(Interface.class, new InterfaceKey(name))
             .augmentation(
index ad2d4f6..481ac67 100644 (file)
@@ -61,7 +61,7 @@ public class RewriteCustomizerTest extends ReaderCustomizerTest<Rewrite, Rewrite
     private ArgumentCaptor<List<PushTags>> captor;
 
     public RewriteCustomizerTest() {
-        super(Rewrite.class);
+        super(Rewrite.class, L2Builder.class);
     }
 
     @Override
@@ -75,14 +75,6 @@ public class RewriteCustomizerTest extends ReaderCustomizerTest<Rewrite, Rewrite
         return new RewriteCustomizer(api, interfacesContext);
     }
 
-    @Test
-    public void testMerge() {
-        final L2Builder builder = mock(L2Builder.class);
-        final Rewrite value = mock(Rewrite.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setRewrite(value);
-    }
-
     private InstanceIdentifier<Rewrite> getVlanTagRewriteId(final String name, final long index) {
         final Class<ChildOf<? super SubInterface>> child = (Class)Rewrite.class;
         final InstanceIdentifier id =
index 74580bb..d52cb3f 100644 (file)
@@ -63,7 +63,7 @@ public class SubInterfaceCustomizerTest extends
     private NamingContext interfacesContext;
 
     public SubInterfaceCustomizerTest() {
-        super(SubInterface.class);
+        super(SubInterface.class, SubInterfacesBuilder.class);
     }
 
     @Override
@@ -84,14 +84,6 @@ public class SubInterfaceCustomizerTest extends
                 SubInterfaces.class).child(SubInterface.class, new SubInterfaceKey(id));
     }
 
-    @Test
-    public void testMerge() {
-        final SubInterfacesBuilder builder = mock(SubInterfacesBuilder.class);
-        final  List<SubInterface> value = mock(List.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setSubInterface(value);
-    }
-
     @Test
     public void testRead() throws ReadFailedException {
         final Map<Integer, SwInterfaceDetails> cachedInterfaceDump = new HashMap<>();
index 4bab8fc..a4cf9b5 100644 (file)
@@ -37,6 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -58,7 +59,7 @@ public class VxlanCustomizerTest extends ReaderCustomizerTest<Vxlan, VxlanBuilde
             .augmentation(VppInterfaceStateAugmentation.class).child(Vxlan.class);
 
     public VxlanCustomizerTest() {
-        super(Vxlan.class);
+        super(Vxlan.class, VppInterfaceStateAugmentationBuilder.class);
     }
 
     @Override
index 19b3be8..b38f40c 100644 (file)
@@ -37,6 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpeBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -58,7 +59,7 @@ public class VxlanGpeCustomizerTest extends ReaderCustomizerTest<VxlanGpe, Vxlan
             .augmentation(VppInterfaceStateAugmentation.class).child(VxlanGpe.class);
 
     public VxlanGpeCustomizerTest() {
-        super(VxlanGpe.class);
+        super(VxlanGpe.class, VppInterfaceStateAugmentationBuilder.class);
     }
 
     @Override
index fc189d3..c841b45 100644 (file)
@@ -30,7 +30,6 @@ import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
 import io.fd.honeycomb.translate.v3po.util.Ipv4Translator;
 import io.fd.honeycomb.translate.v3po.util.NamingContext;
 import io.fd.honeycomb.vpp.test.read.ListReaderCustomizerTest;
-import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
@@ -66,7 +65,7 @@ public class Ipv4AddressCustomizerTest extends ListReaderCustomizerTest<Address,
     private NamingContext interfacesContext;
 
     public Ipv4AddressCustomizerTest() {
-        super(Address.class);
+        super(Address.class, Ipv4Builder.class);
     }
 
     @Override
@@ -197,16 +196,4 @@ public class Ipv4AddressCustomizerTest extends ListReaderCustomizerTest<Address,
         assertEquals(true, "192.168.2.2".equals(ids.get(1).getValue()));
         assertEquals(true, "192.168.2.3".equals(ids.get(2).getValue()));
     }
-
-    @Test
-    public void testMerge() {
-
-        Address address = new AddressBuilder().build();
-        Ipv4Builder ipv4Builder = new Ipv4Builder();
-        getCustomizer().merge(ipv4Builder, Arrays.asList(address));
-
-        assertEquals(1, ipv4Builder.getAddress().size());
-        assertEquals(true, ipv4Builder.getAddress().contains(address));
-    }
-
 }
index f453670..31a1e12 100644 (file)
@@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import io.fd.honeycomb.translate.ModificationCache;
@@ -58,7 +57,7 @@ public class ClassifySessionReaderTest extends
     private VppClassifierContextManager classifierContext;
 
     public ClassifySessionReaderTest() {
-        super(ClassifySession.class);
+        super(ClassifySession.class, ClassifyTableBuilder.class);
     }
 
     @Override
@@ -73,14 +72,6 @@ public class ClassifySessionReaderTest extends
             .child(ClassifySession.class, new ClassifySessionKey(new HexString(match)));
     }
 
-    @Test
-    public void testMerge() {
-        final ClassifyTableBuilder builder = mock(ClassifyTableBuilder.class);
-        final List<ClassifySession> value = mock(List.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setClassifySession(value);
-    }
-
     @Test
     public void testReadWithCache() throws ReadFailedException {
         final InstanceIdentifier<ClassifySession> id = getClassifySessionId(TABLE_NAME, MATCH_1);
index 95864ce..cc5ac6b 100644 (file)
@@ -58,7 +58,7 @@ public class ClassifyTableReaderTest extends
     private VppClassifierContextManager classifierContext;
 
     public ClassifyTableReaderTest() {
-        super(ClassifyTable.class);
+        super(ClassifyTable.class, VppClassifierStateBuilder.class);
     }
 
     @Override
@@ -94,14 +94,6 @@ public class ClassifyTableReaderTest extends
         verify(builder).setActiveSessions(0L);
     }
 
-    @Test
-    public void testMerge() {
-        final VppClassifierStateBuilder builder = mock(VppClassifierStateBuilder.class);
-        final List<ClassifyTable> value = mock(List.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setClassifyTable(value);
-    }
-
     @Test
     public void testRead() throws ReadFailedException {
         doReturn(future(generateClassifyTableInfoReply())).when(api).classifyTableInfo(any(ClassifyTableInfo.class));
index 67e6128..bbf53ca 100644 (file)
 
 package io.fd.honeycomb.translate.v3po.vppstate;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
 import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
-import io.fd.honeycomb.vpp.test.read.ListReaderCustomizerTest;
 import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Test;
+import io.fd.honeycomb.vpp.test.read.ListReaderCustomizerTest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomainsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomainBuilder;
@@ -37,7 +31,7 @@ public class BridgeDomainCustomizerTest
     private NamingContext interfacesContext;
 
     public BridgeDomainCustomizerTest() {
-        super(BridgeDomain.class);
+        super(BridgeDomain.class, BridgeDomainsBuilder.class);
     }
 
     @Override
@@ -46,14 +40,6 @@ public class BridgeDomainCustomizerTest
         interfacesContext = new NamingContext("generatedIfaceName", "ifc-test-instance");
     }
 
-    @Test
-    public void testMerge() throws Exception {
-        final BridgeDomainsBuilder builder = mock(BridgeDomainsBuilder.class);
-        final List<BridgeDomain> value = Collections.emptyList();
-        getCustomizer().merge(builder, value);
-        verify(builder).setBridgeDomain(value);
-    }
-
     @Override
     protected ReaderCustomizer<BridgeDomain, BridgeDomainBuilder> initCustomizer() {
         return new BridgeDomainCustomizer(api, bdContext);
index f837717..4c0fcd5 100644 (file)
@@ -57,7 +57,7 @@ public class L2FibEntryCustomizerTest extends ListReaderCustomizerTest<L2FibEntr
     private NamingContext interfacesContext;
 
     public L2FibEntryCustomizerTest() {
-        super(L2FibEntry.class);
+        super(L2FibEntry.class, L2FibTableBuilder.class);
     }
 
     @Override
@@ -72,14 +72,6 @@ public class L2FibEntryCustomizerTest extends ListReaderCustomizerTest<L2FibEntr
         return new L2FibEntryCustomizer(api, bdContext, interfacesContext);
     }
 
-    @Test
-    public void testMerge() throws Exception {
-        final L2FibTableBuilder builder = mock(L2FibTableBuilder.class);
-        final List<L2FibEntry> value = Collections.emptyList();
-        getCustomizer().merge(builder, value);
-        verify(builder).setL2FibEntry(value);
-    }
-
     private static InstanceIdentifier<L2FibEntry> getL2FibEntryId(final String bdName, final PhysAddress address) {
         return InstanceIdentifier.create(BridgeDomains.class).child(BridgeDomain.class, new BridgeDomainKey(bdName))
             .child(L2FibTable.class).child(L2FibEntry.class, new L2FibEntryKey(address));
index 71b7dcc..771e1aa 100644 (file)
@@ -17,7 +17,6 @@
 package io.fd.honeycomb.translate.v3po.vppstate;
 
 import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -34,7 +33,7 @@ import org.openvpp.jvpp.core.dto.ShowVersionReply;
 public class VersionCustomizerTest extends ReaderCustomizerTest<Version, VersionBuilder> {
 
     public VersionCustomizerTest() {
-        super(Version.class);
+        super(Version.class, VppStateBuilder.class);
     }
 
     @Override
@@ -42,14 +41,6 @@ public class VersionCustomizerTest extends ReaderCustomizerTest<Version, Version
         return new VersionCustomizer(api);
     }
 
-    @Test
-    public void testMerge() {
-        final VppStateBuilder builder = mock(VppStateBuilder.class);
-        final Version value = mock(Version.class);
-        getCustomizer().merge(builder, value);
-        verify(builder).setVersion(value);
-    }
-
     @Test
     public void testReadCurrentAttributes() throws Exception {
         final ShowVersionReply reply = new ShowVersionReply();
index 0509ef9..8917c02 100644 (file)
 
 package io.fd.honeycomb.vpp.test.read;
 
-import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
 import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer;
-import org.junit.Test;
+import java.lang.reflect.Method;
+import java.util.List;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.Identifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 /**
  * Generic test for classes implementing {@link ListReaderCustomizer} interface.
@@ -36,8 +37,10 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 public abstract class ListReaderCustomizerTest<D extends DataObject & Identifiable<K>, K extends Identifier<D>, B extends Builder<D>> extends
     ReaderCustomizerTest<D, B> {
 
-    protected ListReaderCustomizerTest(Class<D> dataObjectClass) {
-        super(dataObjectClass);
+    protected ListReaderCustomizerTest(
+        final Class<D> dataObjectClass,
+        final Class<? extends Builder<? extends DataObject>> parentBuilderClass) {
+        super(dataObjectClass, parentBuilderClass);
     }
 
     @Override
@@ -45,8 +48,13 @@ public abstract class ListReaderCustomizerTest<D extends DataObject & Identifiab
         return ListReaderCustomizer.class.cast(super.getCustomizer());
     }
 
-    @Test
-    public void testGetBuilder() throws Exception {
-        assertNotNull(getCustomizer().getBuilder(InstanceIdentifier.create(dataObjectClass)));
+    @Override
+    public void testMerge() throws Exception {
+        final Builder<? extends DataObject> parentBuilder = mock(parentBuilderClass);
+        final List<D> value = (List<D>) mock(List.class);
+        getCustomizer().merge(parentBuilder, value);
+
+        final Method method = parentBuilderClass.getMethod("set" + dataObjectClass.getSimpleName(), List.class);
+        method.invoke(verify(parentBuilder), value);
     }
 }
index 6486c8e..22dc2b6 100644 (file)
@@ -17,6 +17,8 @@
 package io.fd.honeycomb.vpp.test.read;
 
 import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
 import io.fd.honeycomb.translate.MappingContext;
 import io.fd.honeycomb.translate.ModificationCache;
@@ -26,6 +28,7 @@ import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
 import io.fd.honeycomb.vpp.test.util.FutureProducer;
 import io.fd.honeycomb.vpp.test.util.NamingContextHelper;
+import java.lang.reflect.Method;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -52,12 +55,16 @@ public abstract class ReaderCustomizerTest<D extends DataObject, B extends Build
     @Mock
     protected MappingContext mappingContext;
 
-    protected ModificationCache cache;
+    protected final Class<? extends Builder<? extends DataObject>> parentBuilderClass;
     protected final Class<D> dataObjectClass;
+    protected ModificationCache cache;
     protected ReaderCustomizer<D, B> customizer;
 
-    protected ReaderCustomizerTest(Class<D> dataObjectClass) {
+    public ReaderCustomizerTest(
+        final Class<D> dataObjectClass,
+        final Class<? extends Builder<? extends DataObject>> parentBuilderClass) {
         this.dataObjectClass = dataObjectClass;
+        this.parentBuilderClass = parentBuilderClass;
     }
 
     @Before
@@ -87,5 +94,13 @@ public abstract class ReaderCustomizerTest<D extends DataObject, B extends Build
         assertNotNull(customizer.getBuilder(InstanceIdentifier.create(dataObjectClass)));
     }
 
-    // TODO HONEYCOMB-116: create generic testMerge()
+    @Test
+    public void testMerge() throws Exception {
+        final Builder<? extends DataObject> parentBuilder = mock(parentBuilderClass);
+        final D value = mock(dataObjectClass);
+        getCustomizer().merge(parentBuilder, value);
+
+        final Method method = parentBuilderClass.getMethod("set" + dataObjectClass.getSimpleName(), dataObjectClass);
+        method.invoke(verify(parentBuilder), value);
+    }
 }