最近,我们的系统中出现了一个错误,这是由于忘记在复制构造函数中分配一个新添加的类属性造成的。
举例来说:
public class MyClass {
private Long companyId;
private Long classId;
private Double value; <= newly added
public MyClass(MyClass myClass) {
this.setCompanyId(myClass.getCompanyId());
this.setClassId(myClass.getClassId());
this.setValue(myClass.getValue()); <= we forget this line
}
字符串
我想写一个单元测试,保证在添加新属性时捕获丢失的复制赋值。我应该如何进行?
3条答案
按热度按时间nhaq1z211#
IMO,有三种方法可以解决这个问题
1.使用自动更新的复制构造函数(例如使用Lombok)
字符串
1.创建一个用非默认值填充对象的测试,然后使用反射/Jackson读取其所有键值对,并确保该值不是默认值(
null
、0
、0.0
、false
、'\0'
)型
1.使用一个复杂的对象随机数发生器,比如EasyRandom,并在单元测试中使用它,并执行复制构造函数
型
uhry853o2#
我会用反射来做这个。
MyClass
示例。(A)getClass().getDeclaredFields()
完成。MyClass
的空示例。(B)ercv8c1e3#
**1)**在Makoto的帖子中,我曾经使用过一种方法来通过编程控制克隆的正确性。但这是一件很难和很长的事情。
我给予你我用来做单元测试的代码。它肯定是可以完善的:
字符串
**2)**这不是关于U.T.的自动控制,而是关于IDE内部的开发时间:
这些天来,我删除了所有的
clone()
方法,因为我知道它们是一个不好的做法,用复制构造函数来代替它们。我注意到,如果像 IntelliJ 这样的IDE在类
MyClass
中检测到MyClass(MyClass source) {...}
形式的构造函数,如果缺少一个赋值,它就会发出警告。的数据
类名称用黄色包围,并带有消息:
Copy constructor does not copy field 'population'
。