package com.alibaba.tamper; import java.math.BigInteger; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.Assert; import junit.framework.TestCase; import org.junit.Before; import org.junit.Test; import com.alibaba.tamper.core.builder.BeanMappingBuilder; import com.alibaba.tamper.core.config.BeanMappingConfigHelper; import com.alibaba.tamper.core.config.BeanMappingConfigRespository; /** * 基于API构造mapping进行测试,更全面的测试 * * @author jianghang 2011-6-22 下午01:51:19 */ public class BeanMappingNestAndNameTest extends TestCase { private static final String ONE = "one"; private static final String TWO = "two"; private static final String THREE = "three"; private static final String ONE_OTHER = "oneOther"; private static final String TWO_OTHER = "twoOther"; private static final String THREE_OTHER = "threeOther"; @Before public void setUp() { try { // 清空下repository下的数据 TestUtils.setField(BeanMappingConfigHelper.getInstance(), "repository", new BeanMappingConfigRespository()); } catch (Exception e) { Assert.fail(); } } @Test public void testName() { BeanMappingBuilder builder = new BeanMappingBuilder() { protected void configure() { behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为 mapping("testName", HashMap.class, HashMap.class); fields(srcField(ONE, String.class), targetField(ONE_OTHER, String.class)); fields(srcField(TWO, String.class), targetField(TWO_OTHER, String.class)); fields(srcField(THREE, String.class), targetField(THREE_OTHER, String.class)); } }; BeanMappingConfigHelper.getInstance().register(builder);// 注册 BeanMapping mapping = BeanMapping.create("testName");// 获取 Map src = new HashMap(); src.put(ONE, null);// 测试null value src.put(TWO, " "); // 测试emptyString src.put(THREE, " ljh "); // 测试trimStrings Map dest = new HashMap(); dest.put(ONE_OTHER, "ljh"); // 先设一个值,验证下是否有mapping dest.put(TWO_OTHER, "ljh"); // 先设一个值,验证下是否有mapping mapping.mapping(src, dest); assertEquals(dest.get(ONE_OTHER), "ljh"); assertEquals(dest.get(TWO_OTHER), "ljh"); assertEquals(dest.get(THREE_OTHER), "ljh"); } @Test public void testNestedNameMapping() {// 测试嵌套mapping处理 BeanMappingBuilder builder = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping(HashMap.class, HashMap.class); fields(srcField(ONE, String.class), targetField(ONE_OTHER, BigInteger.class)); fields(srcField(TWO, HashMap.class), targetField(TWO_OTHER, HashMap.class)).recursiveMapping(true, "nestedMapping"); } }; // 第三层mapping final BeanMappingBuilder nextNestedMapping = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping("nextNestedMapping", HashMap.class, HashMap.class); fields(srcField(THREE), targetField(THREE_OTHER)); } }; // 第二层mapping BeanMappingBuilder nestedMapping = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping("nestedMapping", HashMap.class, HashMap.class); fields(srcField(TWO), targetField(TWO_OTHER)); fields(srcField(THREE), targetField(THREE_OTHER)).recursiveMapping(true).nestObject(nextNestedMapping); } }; BeanMappingConfigHelper.getInstance().register(nestedMapping); BeanMappingConfigHelper.getInstance().register(nextNestedMapping); BeanMappingConfigHelper.getInstance().register(builder); BeanMapping mapping = new BeanMapping(builder); Map nextNestedMap = new HashMap(); nextNestedMap.put(THREE, "nextNestedMap three"); Map nestedMap = new HashMap(); nestedMap.put(TWO, "nestedMap two"); nestedMap.put(THREE, nextNestedMap); Map src = new HashMap(); src.put(ONE, "10"); src.put(TWO, nestedMap); Map dest = new HashMap(); mapping.mapping(src, dest); assertEquals(dest.get(ONE_OTHER), BigInteger.valueOf(10)); Map nestedOtherMap = (Map) dest.get(TWO_OTHER); assertEquals(nestedOtherMap.get(TWO_OTHER), "nestedMap two"); Map nextNestedOtherMap = (Map) nestedOtherMap.get(THREE_OTHER); assertEquals(nextNestedOtherMap.get(THREE_OTHER), "nextNestedMap three"); } @Test public void testCollectionAndNestedNameMapping() {// 测试嵌套collection mapping处理 BeanMappingBuilder builder = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping(HashMap.class, HashMap.class); fields(srcField(ONE, String.class), targetField(ONE_OTHER, BigInteger.class)); fields(srcField(TWO, List.class).componentClasses(HashMap.class), targetField(TWO_OTHER, List.class).componentClasses(HashMap.class)).nestName("nestedMapping"); } }; // 第三层mapping final BeanMappingBuilder nextNestedMapping = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping("nextNestedMapping", HashMap.class, HashMap.class); fields(srcField(THREE), targetField(THREE_OTHER)); } }; // 第二层mapping BeanMappingBuilder nestedMapping = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping("nestedMapping", HashMap.class, HashMap.class); fields(srcField(TWO), targetField(TWO_OTHER)); fields(srcField(THREE), targetField(THREE_OTHER)).recursiveMapping(true).nestObject(nextNestedMapping); } }; BeanMappingConfigHelper.getInstance().register(nextNestedMapping); BeanMappingConfigHelper.getInstance().register(nestedMapping); BeanMappingConfigHelper.getInstance().register(builder); BeanMapping mapping = new BeanMapping(builder); Map nextNestedMap1 = new HashMap(); nextNestedMap1.put(THREE, "nextNestedMap three1"); Map nestedMap1 = new HashMap(); nestedMap1.put(TWO, "nestedMap two1"); nestedMap1.put(THREE, nextNestedMap1); Map nextNestedMap2 = new HashMap(); nextNestedMap2.put(THREE, "nextNestedMap three2"); Map nestedMap2 = new HashMap(); nestedMap2.put(TWO, "nestedMap two2"); nestedMap2.put(THREE, nextNestedMap2); Map src = new HashMap(); src.put(ONE, "10"); src.put(TWO, Arrays.asList(nestedMap1, nestedMap2)); // 映射集合 Map dest = new HashMap(); mapping.mapping(src, dest); assertEquals(dest.get(ONE_OTHER), BigInteger.valueOf(10)); List nestedOtherMap = (List) dest.get(TWO_OTHER); assertEquals(nestedOtherMap.size(), 2); Map nestedOtherMap1 = (Map) nestedOtherMap.get(0); assertEquals(nestedOtherMap1.get(TWO_OTHER), "nestedMap two1"); Map nextNestedOtherMap1 = (Map) nestedOtherMap1.get(THREE_OTHER); assertEquals(nextNestedOtherMap1.get(THREE_OTHER), "nextNestedMap three1"); Map nestedOtherMap2 = (Map) nestedOtherMap.get(1); assertEquals(nestedOtherMap2.get(TWO_OTHER), "nestedMap two2"); Map nextNestedOtherMap2 = (Map) nestedOtherMap2.get(THREE_OTHER); assertEquals(nextNestedOtherMap2.get(THREE_OTHER), "nextNestedMap three2"); } }