Java Apache BeanUtils在从不同类复制列表项时发生行为冲突

Java Apache BeanUtils在从不同类复制列表项时发生行为冲突,java,apache-commons-beanutils,Java,Apache Commons Beanutils,我正在开发一个应用程序,将一个类的数据复制到另一个类 我正在测试getter setter方法是否正常工作。为了提高测试覆盖率我制作了一些类和方法,它们将使用podamfactory来填充给定类成员中的数据 然后,我使用apachebeanutils将该对象的数据复制到另一个对象 然后我断言这两个对象以检查它们是否具有相同的数据 我面临的问题是: 我创建了3个类: java[具有运行应用程序的主方法] java[只有一个成员,即字符串集合,它的getter方法和add方法用于在该成员中添加数据]

我正在开发一个应用程序,将一个类的数据复制到另一个类

我正在测试
getter setter
方法是否正常工作。为了提高
测试覆盖率
我制作了一些类和方法,它们将使用
podamfactory
来填充给定类成员中的数据

然后,我使用
apachebeanutils
将该对象的数据复制到另一个对象

然后我断言这两个对象以检查它们是否具有相同的数据

我面临的问题是: 我创建了3个类:

  • java[具有运行应用程序的主方法]
  • java[只有一个成员,即字符串集合,它的getter方法和add方法用于在该成员中添加数据]
  • ParentClass.java[在这个类中,已经创建并实例化了ChildClass的实例以及相关的getter和setter方法。还有hashcode和equals方法]
  • 代码:

    公共类初学者{
    静态最终PodamFactory工厂=新的PodamFactoryImpl();
    公共静态void main(字符串[]args)引发异常{
    系统输出打印项次(“开始”);
    testclass(ParentClass.class);
    系统输出打印项次(“结束”);
    }
    公共静态void测试类(最终类klass)引发异常{
    最终对象源=factory.manufacturePojo(klass);
    最终对象目标=klass.newInstance();
    复制属性(目的地、来源);
    Assert.assertEquals(源、目标);
    Assert.assertNotEquals(源,新对象());
    Assert.assertEquals(source.hashCode(),destination.hashCode());
    }
    }
    
    Main
    方法中,我传递
    ParentClass
    来检查它的getter setter<代码>测试类方法完成复制和断言的主要工作

    在调试时,我发现在复制类的属性之后,子类的实例有一个列表,它有5个成员。在这两个对象中,
    列表
    元素中有5个成员

    但是当我在
    Main
    中传递
    ChildClass
    时,尝试调试我在
    source
    中得到
    5个元素
    ,在
    复制属性后在
    目标
    类中得到
    0个元素

    所以我不理解
    BeanUtils
    的这种行为,如果我在
    Main
    中通过
    ChildClass
    时想要做同样的工作,我需要做什么

    当我传递
    ParentClass
    时,它有不同的行为;当我传递
    ChildClass
    时,它在
    复制属性中有不同的行为

    我已创建以显示我的代码。您可以访问并检查我的应用程序的代码

    我已经为依赖关系管理创建了简单的
    gradle
    项目

    如果有人知道更多,请告诉我


    谢谢。

    BeanUtils遵循Java Bean意义上的属性的严格定义,即每个属性必须具有名为get+字段名的getter和名为set+字段名的setter。而您的子类不包含setFields()setter。换句话说,你可以这样改变它

    public class ChildClass {
    
        private final List<String> fields = new ArrayList<>();
    
        public List<String> getFields() {
            return this.fields;
        }
    
        public List<String> setFields(List<String> fields) {
            this.fields = fields;
        }
    }
    
    公共类子类{
    私有最终列表字段=新ArrayList();
    公共列表getFields(){
    返回此字段;
    }
    公共列表设置字段(列表字段){
    this.fields=字段;
    }
    }
    
    或者

    public class ChildClass {
    
        private final List<String> fields = new ArrayList<>();
    
        public List<String> getFields() {
            return this.fields;
        }
    
        public List<String> setFields(List<String> fields) {
            this.fields.clear();
            this.fields.addAll(fields);
        }
    }
    
    公共类子类{
    私有最终列表字段=新ArrayList();
    公共列表getFields(){
    返回此字段;
    }
    公共列表设置字段(列表字段){
    this.fields.clear();
    this.fields.addAll(字段);
    }
    }
    
    这是一个beanutils问题,而不是Podam问题。我建议你把jemos podam标签拿掉。Podam的行为符合预期,即它用值填充您的成员属性。
    public class ChildClass {
    
        private final List<String> fields = new ArrayList<>();
    
        public List<String> getFields() {
            return this.fields;
        }
    
        public List<String> setFields(List<String> fields) {
            this.fields.clear();
            this.fields.addAll(fields);
        }
    }