Chinaunix首页 | 论坛 | 博客
  • 博客访问: 529685
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: Java

2011-04-22 09:14:28

  1. package me.test.beanutils;

  2. import java.util.ArrayList;
  3. import java.util.LinkedHashMap;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import java.util.Map;

  7. import junit.framework.TestCase;

  8. import org.apache.commons.beanutils.BeanUtils;
  9. import org.apache.commons.beanutils.PropertyUtils;
  10. import org.junit.After;
  11. import org.junit.Before;
  12. import org.junit.Test;

  13. /**
  14.  * 测试环境:
  15.  * BeanUtils :1.8.3
  16.  *
  17.  * 结论:
  18.  * 1.8.3版本的BeanUtils可以读取一个Bean进行任意层次的属性值。
  19.  * 但是对于写入,若某个Bean的所有属性都是null,则BeanUtils只能对基本数据类型、
  20.  * 基本数据类型的数组类型,List类型的属性进行实例化,然后再赋值;
  21.  * 对于其他类型(如Map,自定义JavaBean类型的属性)则不进行实例化,进而无法赋值。
  22.  * 但是如果你事先先将这些复杂类型的变量示例化好了之后,则可以进行赋值。
  23.  *
  24.  * 背景:
  25.  * 都不知道业界同类现在在做Java Web项目的时候,都在使用什么框架。不过,偶现在还在
  26.  * 使用Struts 1.2.9。是不是太老旧了些??
  27.  * 想起些JSP页面,那个叫头疼啊,各种自定义JSP标签(Struts的一堆),JS脚本,CSS式样,
  28.  * HTML标签,恶心死了,都。
  29.  * 决定,自己慢慢尝试不使用JSP扩展标签的路线。比如:Restful + JS框架? without JSP??
  30.  * 哦,题外话了。回到正题吧。
  31.  *
  32.  * 还是那个Struts。遇到一个业务,先查询到一个记录的List,List中的每个元素都是自己定义的POJO,
  33.  * 然后呈现到JSP页面上,但是,需要允许用户修改部分记录的几个值。
  34.  * 不过,这里的ActionForm都是使用Struts的DynamicActionForm的。
  35.  * Struts 会自动从request中取得参数,然后将参数填充到动态form的基本数据类型和基本数据类型的数组类型的字段里,
  36.  * 对于其他复杂类型的字段,比如List、Map、或自定义Javabean,Struts不会为其创建对象实例,
  37.  * 因此,request中的参数也无法填充到这些动态Form的级联属性中。
  38.  *
  39.  * 但是,假若我执行完查询,我负责将这些复杂属性初始化,并将Form的Scope设为Session,
  40.  * 然后在下一次提交时,能够通过参数修改这里复杂属性中的属性值?
  41.  *
  42.  * 看了下Struts的源码,在RequestUtils#populate()方法中使用了 Appache Commons BeanUtils
  43.  * 中 BeanUtils#populate(Object bean, Map properties) 方法。在Struts中,bean指的是
  44.  * Struts创建/从指定作用域取得的ActionForm,properties则指的是request中的参数。
  45.  *
  46.  * 看来,上述疑问能否解答,就看BeanUtils行不行啦。趁机也认真学习下BeanUtils。
  47.  *
  48.  * 参考:
  49.  *
  50.  *
  51.  * PS : Struts 1.2.9 使用的是BeanUtils的版本是 1.7.0,可是在最初的测试时发现该版本不少问题,
  52.  * 瞅了瞅Apache官网的archive站点,返现1.7.0版本是2004年8月发布的呢,可真有些年头了。
  53.  * 后来,使用了最新的 1.8.3进行测试。如果你还在使用Struts 1.2.9,可以更新其中的
  54.  * Commons BeanUtils的jar包,或使用Struts 1.X 的最新版 1.3.10。
  55.  *
  56.  * BeanUtils 1.7.0 的部分问题:
  57.  * 0. 对于Map类型的成员变量,BeanUtils总是先尝试将Map填充为 Map 类型。
  58.  * 1. 对于Map类型的成员变量,如果重新的值为 String[],则只会使用第一个数组元素的值,而不是使用整个数组,
  59.  * 且数组长度不可以为0,否则报 java.lang.ArrayIndexOutOfBound***ception: 0
  60.  * 2. 对于Map类型的成员变量,将无法使用 "." "[]"等级联表达式设置新值。
  61.  *
  62.  *
  63.  */
  64. public class JavaBeanTest {

  65.     public static class Person {
  66.         private String name = "";
  67.         private int age = 0;
  68.         private String[] alias = null;
  69.         private List<String> hobby = null;
  70.         private List<Person> friends = null;

  71.         // 如果默认为null,则 "IllegalArgumentException: Null property value for 'addr'"
  72.         // 因为Map是一个接口,BeanUtils不知道该使用哪一个实现类来实例化。
  73.         private Map<String, String> addr = new LinkedHashMap<String, String>(); // 需要事先手动实例化好
  74.         private Map<String, Object[]> friendGroups = new LinkedHashMap<String, Object[]>(); // 需要事先手动实例化好
  75.         private Person father = null;

  76.         public String getName() {
  77.             return name;
  78.         }
  79.         public void setName(String name) {
  80.             this.name = name;
  81.         }
  82.         public int getAge() {
  83.             return age;
  84.         }
  85.         public void setAge(int age) {
  86.             this.age = age;
  87.         }
  88.         public String[] getAlias() {
  89.             return alias;
  90.         }
  91.         public void setAlias(String[] alias) {
  92.             this.alias = alias;
  93.         }
  94.         public List<String> getHobby() {
  95.             return hobby;
  96.         }
  97.         public void setHobby(List<String> hobby) {
  98.             this.hobby = hobby;
  99.         }
  100.         public List<Person> getFriends() {
  101.             return friends;
  102.         }
  103.         public void setFriends(List<Person> friends) {
  104.             this.friends = friends;
  105.         }
  106.         public Map<String, String> getAddr() {
  107.             return addr;
  108.         }
  109.         public void setAddr(Map<String, String> addr) {
  110.             this.addr = addr;
  111.         }
  112.         public Map<String, Object[]> getFriendGroups() {
  113.             return friendGroups;
  114.         }
  115.         public void setFriendGroups(Map<String, Object[]> friendGroups) {
  116.             this.friendGroups = friendGroups;
  117.         }
  118.         public Person getFather() {
  119.             return father;
  120.         }
  121.         public void setFather(Person father) {
  122.             this.father = father;
  123.         }
  124.     }

  125.     /**
  126.      * 建立测试环境
  127.      */
  128.     @Before
  129.     public void setUp() throws Exception {
  130.     }

  131.     /**
  132.      * 清理测试环境
  133.      */
  134.     @After
  135.     public void tearDown() {
  136.     }

  137.     /**
  138.      * 写入基本数据类型 —— String
  139.      */
  140.     @Test
  141.     public void testPopulate01() throws Exception {

  142.         // ■ 准备环境

  143.         // ■ 准备参数
  144.         Person person = new Person();
  145.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  146.         props.put("name", "Zhang3");

  147.         // ■ 执行
  148.         BeanUtils.populate(person, props);

  149.         // ■ 验证结果
  150.         TestCase.assertEquals("Zhang3", person.getName());

  151.         // ■ 验证环境
  152.     }

  153.     /**
  154.      * 写入基本数据类型 —— Integer,
  155.      * 但是实际JavaBean声明的是String,这时,由BeanUtils自动完成类型转换。
  156.      */
  157.     @Test
  158.     public void testPopulate02() throws Exception {

  159.         // ■ 准备环境

  160.         // ■ 准备参数
  161.         Person person = new Person();
  162.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  163.         props.put("name", 111);

  164.         // ■ 执行
  165.         BeanUtils.populate(person, props);

  166.         // ■ 验证结果
  167.         TestCase.assertEquals("111", person.getName());

  168.         // ■ 验证环境
  169.     }

  170.     /**
  171.      * 写入基本数据类型 —— String
  172.      * 注意:如果写入的基本数据类型是String,则写入的变量可以是一个String[],
  173.      * 但是只使用第一个元素的值。
  174.      *
  175.      * 在Struts 1.3.9 中,在没有上传文件的情况下,就总是每个参数使用
  176.      * request.getParameterValues(name) 获取一个String[]的。
  177.      */
  178.     @Test
  179.     public void testPopulate03() throws Exception {

  180.         // ■ 准备环境

  181.         // ■ 准备参数
  182.         Person person = new Person();
  183.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  184.         props.put("name", new String[]{"Zhang3", "Zhang4"});

  185.         // ■ 执行
  186.         BeanUtils.populate(person, props);

  187.         // ■ 验证结果
  188.         TestCase.assertEquals("Zhang3", person.getName());

  189.         // ■ 验证环境
  190.     }

  191.     /**
  192.      * 写入基本数据类型 —— Integer,
  193.      */
  194.     @Test
  195.     public void testPopulate04() throws Exception {

  196.         // ■ 准备环境

  197.         // ■ 准备参数
  198.         Person person = new Person();
  199.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  200.         props.put("age", new String[]{"111", "222"});

  201.         // ■ 执行
  202.         BeanUtils.populate(person, props);

  203.         // ■ 验证结果
  204.         TestCase.assertEquals(111, person.getAge());

  205.         // ■ 验证环境
  206.     }

  207.     /**
  208.      * 写入基本数据类型的数组 —— String[]
  209.      * 由于此时能通过反射机制获取JavaBean声明的实际类型就是 String[],
  210.      * 此时,就原原本本的赋值过去。
  211.      */
  212.     @Test
  213.     public void testPopulate05() throws Exception {

  214.         // ■ 准备环境

  215.         // ■ 准备参数
  216.         Person person = new Person();
  217.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  218.         props.put("alias", new String[]{"DaXingXing", "XiaoZhang"});

  219.         // ■ 执行
  220.         //
  221.         BeanUtils.populate(person, props);

  222.         // ■ 验证结果
  223.         TestCase.assertEquals(2, person.getAlias().length);
  224.         TestCase.assertEquals("DaXingXing", person.getAlias()[0]);
  225.         TestCase.assertEquals("XiaoZhang", person.getAlias()[1]);

  226.         // ■ 验证环境
  227.     }

  228.     /**
  229.      * 写入List —— VALUE : String。
  230.      * 注意:由于泛型信息在编译后丢失,所以使用时需要注意写入变量的类型
  231.      * 需与POJO对应属性声明的类型保持一致。
  232.      */
  233.     @Test
  234.     public void testPopulate06() throws Exception {

  235.         // ■ 准备环境

  236.         // ■ 准备参数
  237.         Person person = new Person();
  238.         Map<String, Object> props = new LinkedHashMap<String, Object>();

  239.         List<Object> hobby = new ArrayList<Object>();
  240.         hobby.add("basketball");
  241.         hobby.add("ride");
  242.         // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  243.         // hobby.add(111);

  244.         // 不能使用String[],否则java.lang.IllegalArgumentException:... argument type mismatch
  245.         // 因此,在使用Struts的动态Form的时候,如果用来接收表单中的数组值的话,
  246.         // 该属性只能声明为数组类型,而不能是List类型。
  247.         //props.put("hobby", new String[]{"basketball", "ride"});
  248.         props.put("hobby", hobby);

  249.         // ■ 执行
  250.         BeanUtils.populate(person, props);

  251.         // ■ 验证结果
  252.         TestCase.assertEquals(2, person.getHobby().size());
  253.         TestCase.assertEquals("basketball", person.getHobby().get(0));
  254.         TestCase.assertEquals("ride", person.getHobby().get(1));
  255.         //TestCase.assertEquals("111", person.getHobby().get(2));

  256.         // ■ 验证环境
  257.     }

  258.     /**
  259.      * 写入List —— VALUE : Person。
  260.      * 说明:这种情况一般是在Struts中自己的将大量查询结构设置到Form中,
  261.      * 然后呈现给用户。但是假如允许用户级联修改其中个别值时,该如何做?
  262.      */
  263.     @Test
  264.     public void testPopulate07() throws Exception {

  265.         // ■ 准备环境

  266.         // ■ 准备参数
  267.         // 先构模拟构建查询后的结果列表,这里的Person相当于Struts中的ActionForm。
  268.         List<Person> friends = new LinkedList<Person>();
  269.         Person friend = new Person();
  270.         friend.setName("F1");
  271.         friend.setAge(21);
  272.         friend.setAlias(new String[]{"AA", "BB"});
  273.         friends.add(friend);
  274.         friend = new Person();
  275.         friend.setName("F2");
  276.         friend.setAge(22);
  277.         friend.setAlias(new String[]{"XX", "YY"});
  278.         friends.add(friend);

  279.         Person person = new Person();
  280.         person.setName("Zhang3");
  281.         person.setAge(23);
  282.         person.setFriends(friends);

  283.         // 模拟构建JSP页面用户修改的部分值
  284.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  285.         props.put("friends[0].alias", new String[]{"BB", "CC"});

  286.         // ■ 执行
  287.         BeanUtils.populate(person, props);

  288.         // ■ 验证结果

  289.         // 需要改变的被改变,不需要改变的仍然没有变
  290.         TestCase.assertEquals("Zhang3", person.getName());
  291.         TestCase.assertEquals(23, person.getAge());
  292.         friends = person.getFriends();
  293.         TestCase.assertEquals(2, friends.size());

  294.         friend = friends.get(0);
  295.         TestCase.assertEquals("F1", friend.getName());
  296.         TestCase.assertEquals(21, friend.getAge());
  297.         String[] alias = friend.getAlias();
  298.         TestCase.assertEquals(2, alias.length);
  299.         TestCase.assertEquals("BB", alias[0]);
  300.         TestCase.assertEquals("CC", alias[1]);

  301.         friend = friends.get(1);
  302.         TestCase.assertEquals("F2", friend.getName());
  303.         TestCase.assertEquals(22, friend.getAge());
  304.         alias = friend.getAlias();
  305.         TestCase.assertEquals(2, alias.length);
  306.         TestCase.assertEquals("XX", alias[0]);
  307.         TestCase.assertEquals("YY", alias[1]);

  308.         // ■ 验证环境
  309.     }

  310.     /**
  311.      * 写入Map —— KEY : String, VALUE : String。
  312.      * 注意:由于泛型信息在编译后丢失,所以使用时需要注意写入变量的类型
  313.      * 需与POJO对应属性声明的类型保持一致,否则,如下所示,可能会出现一些意外。
  314.      */
  315.     @Test
  316.     public void testPopulate08() throws Exception {

  317.         // ■ 准备环境

  318.         // ■ 准备参数
  319.         Person person = new Person();
  320.         Map<String, Object> props = new LinkedHashMap<String, Object>();

  321.         // 对于Map,不能使用"addr.birth",只能使用"addr(birth)"
  322.         props.put("addr( birth )", "AA");
  323.         // BeanUtils 1.7.0 OK, 但是 1.8.0 则在从Map中取值的时候出现 ClassCastException,
  324.         // props.put("addr(nurserySchool)", (Integer) 111);
  325.         // props.put("addr(primarySchool)", false);
  326.         // props.put("addr(juniorHighSchool)", new String[]{"BB", "CC"});

  327.         // java.lang.ClassCastException: [Ljava.lang.Integer; cannot be cast to java.lang.String
  328.         //props.put("addr(seniorHighSchool)", new Integer[]{ 111});

  329.         // java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.String
  330.         //props.put("addr(university)", new Object());

  331.         // ■ 执行
  332.         BeanUtils.populate(person, props);

  333.         // ■ 验证结果
  334.         Map<String, String> addr = person.getAddr();

  335.         TestCase.assertEquals(1, addr.size());

  336.         // 注意:KEY前后有空格,因为在props.put()的时候,就有空格。
  337.         TestCase.assertEquals("AA", addr.get(" birth "));

  338.         // 注意:通过DEBUG可以看到addr内部实际存储的还是 Integer类型,
  339.         //TestCase.assertEquals("111", addr.get("nurserySchool")); // BeanUtils 1.7.0 通过
  340.         //TestCase.assertEquals("false", addr.get("primarySchool"));// BeanUtils 1.7.0 通过
  341.         //TestCase.assertEquals("BB", addr.get("juniorHighSchool"));// BeanUtils 1.7.0 通过
  342.         //TestCase.assertEquals("[Ljava.lang.Integer;@TESTTEST?", addr.get("seniorHighSchool")); // BeanUtils 1.7.0 不通过
  343.         //TestCase.assertEquals("java.lang.Object@TESTTEST", addr.get("university")); // BeanUtils 1.7.0 不通过

  344.         // ■ 验证环境
  345.     }

  346.     /**
  347.      * 写入Map —— KEY : String, VALUE : (Object)Array。
  348.      */
  349.     @Test
  350.     public void testPopulate09() throws Exception {

  351.         // ■ 准备环境

  352.         // ■ 准备参数
  353.         Person person = new Person();

  354.         Map<String, Object> props = new LinkedHashMap<String, Object>();

  355.         // 在 BeanUitls 1.7.0 中:
  356.         // 不管自定义的JavaBean中的Map属性的类型是什么,
  357.         // 如果Map某个Key的值是 String[],则只取第一个值,
  358.         // 好在1.8.3版本中,对Map 中填充的值不再进行类型转换了。
  359.         props.put("friendGroups(family)", new String[]{"Zhang1", "Zhang2"});
  360.         props.put("friendGroups(colleague)", new Object[]{"Wang2", "Li2"});

  361.         // ■ 执行
  362.         BeanUtils.populate(person, props);

  363.         // ■ 验证结果

  364.         Map<String, Object[]> friendGroups = person.getFriendGroups();
  365.         TestCase.assertEquals(2, friendGroups.size());
  366.         TestCase.assertEquals(2, friendGroups.get("family").length);
  367.         TestCase.assertEquals("Zhang1", friendGroups.get("family")[0]);
  368.         TestCase.assertEquals("Zhang2", friendGroups.get("family")[1]);

  369.         TestCase.assertEquals(2, friendGroups.get("colleague").length);
  370.         TestCase.assertEquals("Wang2", friendGroups.get("colleague")[0]);
  371.         TestCase.assertEquals("Li2", friendGroups.get("colleague")[1]);

  372.         // ■ 验证环境
  373.     }

  374.     /**
  375.      * 写入Map —— KEY : String, VALUE : (Object)Array。
  376.      */
  377.     @SuppressWarnings("unchecked")
  378.     @Test
  379.     public void testPopulate10() throws Exception {

  380.         // ■ 准备环境
  381.         // 初始化已有值的JavaBean/Form

  382.         // Map(TEST) —— Object[]
  383.         Object[] objArr = new Object[3];

  384.         // Map(TEST)[0] —— Person
  385.         Person p = new Person();
  386.         p.setName("F0");
  387.         p.setAge(20);
  388.         p.setAlias(new String[]{"00", "11"});
  389.         objArr[0] = p;

  390.         // Map(TEST)[1] —— List
  391.         List<Person> pList = new LinkedList<Person>();

  392.         p = new Person();
  393.         p.setName("F1");
  394.         p.setAge(21);
  395.         p.setAlias(new String[]{"AA", "BB"});
  396.         pList.add(p);

  397.         p = new Person();
  398.         p.setName("F2");
  399.         p.setAge(22);
  400.         p.setAlias(new String[]{"XX", "YY"});
  401.         pList.add(p);
  402.         objArr[1] = pList;

  403.         // Map(TEST)[1] —— Map
  404.         Map<String, Person> pMap = new LinkedHashMap<String, Person>();
  405.         p = new Person();
  406.         p.setName("F4");
  407.         p.setAge(24);
  408.         p.setAlias(new String[]{"44", "55"});
  409.         pMap.put("F4", p);

  410.         p = new Person();
  411.         p.setName("F5");
  412.         p.setAge(25);
  413.         p.setAlias(new String[]{"55", "66"});
  414.         pMap.put("F5", p);
  415.         objArr[2] = pMap;

  416.         Map<String, Object[]> friendGroups = new LinkedHashMap<String, Object[]>();
  417.         friendGroups.put("TEST", objArr);
  418.         System.out.println(friendGroups.hashCode());
  419.         Person person = new Person();
  420.         person.setName("Zhang3");
  421.         person.setAge(23);
  422.         person.setFriendGroups(friendGroups);

  423.         // ■ 准备参数
  424.         // 初始化要更新的参数
  425.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  426.         props.put("friendGroups(TEST)[0].age", 999);
  427.         props.put("friendGroups(TEST)[1][0].alias[0]", "A1");
  428.         props.put("friendGroups(TEST)[2](F4).alias", new String[]{"404", "505"});

  429.         // ■ 执行
  430.         BeanUtils.populate(person, props);
  431.         System.out.println("========"
  432.                 + PropertyUtils.getProperty(person, "friendGroups").hashCode());
  433.         //System.out.println(((Person)BeanUtils.getProperty(person, "friendGroups(TEST)[0]")).getAge());
  434.         // ■ 验证结果
  435.         TestCase.assertEquals("Zhang3", person.getName());
  436.         TestCase.assertEquals(23, person.getAge());

  437.         friendGroups = person.getFriendGroups();
  438.         TestCase.assertEquals(1, friendGroups.size());

  439.         // Map(TEST) —— Object[]
  440.         objArr = friendGroups.get("TEST");
  441.         TestCase.assertEquals(3, objArr.length);

  442.         // Map(TEST)[0] —— Person
  443.         p = (Person) objArr[0];
  444.         TestCase.assertEquals("F0", p.getName());
  445.         TestCase.assertEquals(999, p.getAge());
  446.         String[] alias = p.getAlias();
  447.         TestCase.assertEquals(2, alias.length);
  448.         TestCase.assertEquals("00", alias[0]);
  449.         TestCase.assertEquals("11", alias[1]);

  450.         // Map(TEST)[1] —— List
  451.         pList = (List<Person>) objArr[1];
  452.         TestCase.assertEquals(2, pList.size());

  453.         p = pList.get(0);
  454.         TestCase.assertEquals("F1", p.getName());
  455.         TestCase.assertEquals(21, p.getAge());
  456.         alias = p.getAlias();
  457.         TestCase.assertEquals(2, alias.length);
  458.         TestCase.assertEquals("A1", alias[0]);
  459.         TestCase.assertEquals("BB", alias[1]);

  460.         p = pList.get(1);
  461.         TestCase.assertEquals("F2", p.getName());
  462.         TestCase.assertEquals(22, p.getAge());
  463.         alias = p.getAlias();
  464.         TestCase.assertEquals(2, alias.length);
  465.         TestCase.assertEquals("XX", alias[0]);
  466.         TestCase.assertEquals("YY", alias[1]);

  467.         // Map(TEST)[1] —— Map
  468.         pMap = (Map<String, Person>) objArr[2];
  469.         TestCase.assertEquals(2, pMap.size());

  470.         p = pMap.get("F4");
  471.         TestCase.assertEquals("F4", p.getName());
  472.         TestCase.assertEquals(24, p.getAge());
  473.         alias = p.getAlias();
  474.         TestCase.assertEquals(2, alias.length);
  475.         TestCase.assertEquals("404", alias[0]);
  476.         TestCase.assertEquals("505", alias[1]);

  477.         p = pMap.get("F5");
  478.         TestCase.assertEquals("F5", p.getName());
  479.         TestCase.assertEquals(25, p.getAge());
  480.         alias = p.getAlias();
  481.         TestCase.assertEquals(2, alias.length);
  482.         TestCase.assertEquals("55", alias[0]);
  483.         TestCase.assertEquals("66", alias[1]);

  484.         // ■ 验证环境
  485.     }

  486.     /**
  487.      * 写入Person
  488.      */
  489.     @Test
  490.     public void testPopulate11() throws Exception {

  491.         // ■ 准备环境

  492.         // ■ 准备参数
  493.         Person person = new Person();

  494.         Map<String, Object> props = new LinkedHashMap<String, Object>();
  495.         person.setFather(new Person()); // 需要事先手动实例化好
  496.         props.put("father.name", new String[]{"Zhang1", "Zhang2"});

  497.         // ■ 执行
  498.         BeanUtils.populate(person, props);

  499.         // ■ 验证结果
  500.         TestCase.assertEquals("Zhang1", person.getFather().getName());

  501.         // ■ 验证环境
  502.     }
  503. }
阅读(1342) | 评论(0) | 转发(0) |
0

上一篇:Java File Lock Test

下一篇:ANT 个人笔记

给主人留下些什么吧!~~