@Before
 public void setUp() {
   try {
     // 清空下repository下的数据
     TestUtils.setField(
         BeanMappingConfigHelper.getInstance(), "repository", new BeanMappingConfigRespository());
   } catch (Exception e) {
     Assert.fail();
   }
 }
  @Test
  public void testNestedMapping() { // 测试嵌套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, BigInteger.class), targetField(TWO_OTHER, Integer.class));
            fields(
                    srcField(THREE, SrcMappingObject.class),
                    targetField(THREE_OTHER, TargetMappingObject.class))
                .recursiveMapping(true);
          }
        };
    // 第二层mapping
    BeanMappingBuilder nestedMapping =
        new BeanMappingBuilder() {

          protected void configure() {
            behavior().debug(true); // 设置行为
            mapping(SrcMappingObject.class, TargetMappingObject.class);
            fields(srcField("intValue"), targetField("intValue"));
            fields(srcField("integerValue"), targetField("integerValue"));
            fields(srcField("start"), targetField("start"));
            fields(srcField("name"), targetField("targetName"));
            fields(srcField("mapping"), targetField("mapping")).recursiveMapping(true);
          }
        };
    // 第三层mapping
    BeanMappingBuilder nextNestedMapping =
        new BeanMappingBuilder() {

          protected void configure() {
            behavior().debug(true); // 设置行为
            mapping(NestedSrcMappingObject.class, NestedTargetMappingObject.class);
            fields(srcField("name"), targetField("name"));
            fields(srcField("bigDecimalValue"), targetField("value"));
          }
        };

    BeanMappingConfigHelper.getInstance().register(nestedMapping);
    BeanMappingConfigHelper.getInstance().register(nextNestedMapping);

    BeanMapping mapping = new BeanMapping(builder);
    Map src = new HashMap();
    src.put(ONE, "10");
    src.put(TWO, BigInteger.TEN);
    SrcMappingObject srcRef = new SrcMappingObject();
    srcRef.setIntegerValue(1);
    srcRef.setIntValue(1);
    srcRef.setName("ljh");
    srcRef.setStart(true);

    NestedSrcMappingObject nestedSrcRef = new NestedSrcMappingObject();
    nestedSrcRef.setBigDecimalValue(BigDecimal.ONE);
    nestedSrcRef.setName("ljh");
    srcRef.setMapping(nestedSrcRef);
    src.put(THREE, srcRef);

    Map dest = new HashMap();
    mapping.mapping(src, dest);
    assertEquals(dest.get(ONE_OTHER), BigInteger.valueOf(10));
    assertEquals(dest.get(TWO_OTHER), Integer.valueOf(10));

    TargetMappingObject targetRef = (TargetMappingObject) dest.get(THREE_OTHER);
    assertNotNull(targetRef.getMapping());
    assertEquals(targetRef.getIntValue(), srcRef.getIntValue());
    assertEquals(targetRef.getIntegerValue(), srcRef.getIntegerValue());
    assertEquals(targetRef.getTargetName(), srcRef.getName());
    assertEquals(targetRef.getMapping().getName(), srcRef.getMapping().getName());
    assertEquals(
        targetRef.getMapping().getValue(), srcRef.getMapping().getBigDecimalValue().toString());
  }
  @Test
  public void testCollectionNestedMapping() { // 测试下collection的mapping
    BeanMappingBuilder builder =
        new BeanMappingBuilder() {

          protected void configure() {
            behavior()
                .debug(true)
                .mappingEmptyStrings(false)
                .mappingNullValue(false)
                .trimStrings(true); // 设置行为
            mapping(HashMap.class, HashMap.class);
            fields(
                srcField(ONE),
                targetField(ONE_OTHER, ArrayList.class)
                    .componentClasses(NestedTargetMappingObject.class));
            fields(
                srcField(TWO),
                targetField(TWO_OTHER, HashSet.class)
                    .componentClasses(NestedTargetMappingObject.class));
            fields(
                srcField(THREE),
                targetField(THREE_OTHER, HashMap[].class).componentClasses(HashMap.class));
          }
        };
    // 第二层mapping
    BeanMappingBuilder nextNestedMapping =
        new BeanMappingBuilder() {

          protected void configure() {
            behavior().debug(true); // 设置行为
            mapping(NestedSrcMappingObject.class, NestedTargetMappingObject.class);
            fields(srcField("name"), targetField("name"));
            fields(srcField("bigDecimalValue"), targetField("value"));
          }
        };

    BeanMappingConfigHelper.getInstance().register(nextNestedMapping);

    BeanMapping mapping = new BeanMapping(builder);
    Map src = new HashMap();
    HashMap[] mapArray = new HashMap[1];
    Map arrayNested = new HashMap();
    arrayNested.put("name", "ljh");
    arrayNested.put("value", "10");
    mapArray[0] = (HashMap) arrayNested;
    src.put(ONE, mapArray);

    List<NestedSrcMappingObject> objectList = new ArrayList<NestedSrcMappingObject>();
    NestedSrcMappingObject listNested = new NestedSrcMappingObject();
    listNested.setBigDecimalValue(BigDecimal.TEN);
    listNested.setName("ljh");
    objectList.add(listNested);
    src.put(TWO, objectList);

    Set<NestedSrcMappingObject> objectSet = new HashSet<NestedSrcMappingObject>();
    NestedSrcMappingObject setNested = new NestedSrcMappingObject();
    setNested.setBigDecimalValue(BigDecimal.TEN);
    setNested.setName("ljh");
    objectSet.add(listNested);
    src.put(THREE, objectSet);

    Map dest = new HashMap();
    mapping.mapping(src, dest);
    List<NestedTargetMappingObject> list = (List) dest.get(ONE_OTHER);
    Set<NestedTargetMappingObject> set = (Set) dest.get(TWO_OTHER);
    HashMap[] array = (HashMap[]) dest.get(THREE_OTHER);
    assertEquals(list.get(0).getName(), "ljh");
    assertEquals(list.get(0).getValue(), "10");
    NestedTargetMappingObject obj = set.iterator().next();
    assertEquals(obj.getName(), "ljh");
    assertEquals(obj.getValue(), "10");
    assertEquals(array[0].get("name"), "ljh");
    assertEquals(array[0].get("bigDecimalValue"), BigDecimal.TEN);
  }