package com.alibaba.tamper;
import java.math.BigInteger;
import java.util.HashMap;
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;
import com.alibaba.tamper.object.inherit.FirstObject;
import com.alibaba.tamper.object.inherit.TwoObject;
import com.alibaba.tamper.process.script.ScriptHelper;
import com.alibaba.tamper.script.CustomFunctionClass;
/**
* 测试一下带继承关系的属性,映射到一平面上
*
* @author jianghang 2011-6-22 下午03:42:51
*/
public class InheritObjectMappingTest extends TestCase {
@Before
public void setUp() {
try {
// 清空下repository下的数据
TestUtils.setField(BeanMappingConfigHelper.getInstance(), "repository", new BeanMappingConfigRespository());
ScriptHelper.getInstance().registerFunctionClass("customFunction", new CustomFunctionClass());
} catch (Exception e) {
Assert.fail();
}
}
@Test
public void testFlat() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(TwoObject.class, HashMap.class);
fields(srcField("name").locatorClass(FirstObject.class), targetField("name"));// name从父类中获取
fields(srcField("firstValue").locatorClass(FirstObject.class), targetField("firstValue"));// 也从父类中获取
fields(srcField("twoValue"), targetField("twoValue"));
}
};
BeanMapping mapping = new BeanMapping(builder);
TwoObject src = new TwoObject("one", "two");
src.setFirstValue(10);
src.setTwoValue(BigInteger.TEN);
Map dest = new HashMap();
mapping.mapping(src, dest);
assertEquals(dest.get("name"), "two"); // 类的多台决定了,针对src调用getName()方法会取到子类的方法
assertEquals(dest.get("firstValue"), Integer.valueOf(10));
assertEquals(dest.get("twoValue"), BigInteger.TEN);
}
@Test
public void testLevel() {
BeanMappingBuilder firstBuilder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(FirstObject.class, HashMap.class);
fields(srcField("firstValue"), targetField("firstValue"));
}
};
BeanMappingBuilder twoBuilder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(TwoObject.class, HashMap.class);
fields(srcField("twoValue"), targetField("twoValue"));
fields(srcField("this", FirstObject.class), targetField("firstMap")).recursiveMapping(true).script(
"customFunction:newHashMap()");
}
};
BeanMappingConfigHelper.getInstance().register(firstBuilder);
BeanMapping mapping = new BeanMapping(twoBuilder);
TwoObject src = new TwoObject("one", "two");
src.setFirstValue(10);
src.setTwoValue(BigInteger.TEN);
Map dest = new HashMap();
mapping.mapping(src, dest);
assertEquals(dest.get("twoValue"), BigInteger.TEN);
assertEquals(((Map) dest.get("firstMap")).get("firstValue"), Integer.valueOf(10));
}
@Test
public void testExchange() {
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
behavior().debug(true);// 设置行为
mapping(TwoObject.class, TwoObject.class);
// firstValue的值设置给twoValue
fields(srcField("firstValue").locatorClass(FirstObject.class),
targetField("twoValue").locatorClass(TwoObject.class));
// twoValue的值设置给firstValue
fields(srcField("twoValue").locatorClass(TwoObject.class),
targetField("firstValue").locatorClass(FirstObject.class));
}
};
BeanMapping mapping = new BeanMapping(builder);
TwoObject src = new TwoObject("one", "two");
src.setFirstValue(11);
src.setTwoValue(BigInteger.valueOf(12));
TwoObject dest = new TwoObject("one1", "two2");
mapping.mapping(src, dest);
assertEquals(dest.getName(), "two2"); // 类的多台决定了,针对src调用getName()方法会取到子类的方法
assertEquals(dest.getFirstValue(), 12);
assertEquals(dest.getTwoValue(), BigInteger.valueOf(11));
}
}