《Java单元测试实战》——无效单测:那些年,我们写过的无效单元测试(7) https://developer.aliyun.com/article/1232108?groupCode=java
4. 模拟数据对象准则
由于没有模拟数据对象章节,这里在验证数据对象章节中插入了模拟数据对象准则。
1) 除触发条件分支外,模拟对象所有属性值不能为空
在上一节中,我们展示了如何完美地验证数据对象。但是,这种方法真正完美吗?答案是否定。
比如:我们把userDAO.queryByCompany方法返回的uesrList的所有UserDO对象的属性值name和desc赋值为空,再把convertUser方法的name和desc赋值做一下交换,上面的单元测试用例是无法验证出来的。
所以,在单元测试中,除触发条件分支外,模拟对象所有属性值不能为空。
2) 新增数据类属性字段时,必须模拟数据对象的属性值
在上面的案例中,如果UserDO和UserVO新增了属性字段age(用户年龄),且新增了赋值语句如下:
如果还是用原有的数据对象执行单元测试,我们会发现单元测试用例执行通过。这是因为,由于属性字段age为空,赋值不赋值没有任何差别。所以,新增属性类属性字段是,必须模拟数据对象的属性值。
注意:如果用JSON字符串对比,且设置输出空字段,是可以触发单元测试用例执行失败的。
5. 验证数据对象准则
1) 必须验证所有数据对象
在单元测试中,必须验证所有数据对象:
• 来源于被测方法的返回值
• 来源于依赖方法的参数捕获
• 来源于被测对象的属性值
• 来源于请求参数的属性值。
具体案例可以参考《数据对象来源方式》章节。
2) 必须使用明确语义的断言
在使用断言验证数据对象时,必须使用确定语义的断言,不能使用不明确语义的断言。
正例:
反例:
谨防一些试图绕过本条准则的案例,试图用明确语义的断言去做不明确语义的判断。
3) 尽量采用整体验证方式
如果一个模型类,会根据业务需要新增字段。那么,针对这个模型类所对应的数据对象,尽量采用整体验证方式。
正例:
反例:
上面这种数据验证方式,如果模型类删除了属性字段,是可以验证出来的。但是,如果模型类添加了字段,是无法验证出来的。所以,如果采用了这种验证方式,在新增了模型类属性字段后,需要梳理并补全测试用例。否则,在使用单元测试用例回归代码时,它将会告诉你这里没有任何问题。
《Java单元测试实战》——无效单测:那些年,我们写过的无效单元测试(9) https://developer.aliyun.com/article/1232106?groupCode=java