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个类:
公共类初学者{
静态最终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);
}
}