我经常创建包含某种Collection(Set,List,等等)的对象。它们永远不会为空。如果构造函数或setter传递null,则会创建新的空集合实例。这是一个错误的例子(由评论标记)。
package com.myapp;
import com.google.common.collect.Lists;
import java.util.List;
public class MyClass {
private List<String> myNeverNullList1;
private List<String> myNeverNullList2;
public MyClass(List<String> myNeverNullList1, List<String> myNeverNullList2) {
this.myNeverNullList1 = myNeverNullList1==null? Lists.newArrayList():myNeverNullList1;
this.myNeverNullList2 = myNeverNullList2==null? Lists.newArrayList():myNeverNullList2;
}
public void setMyNeverNullList1(List<String> myNeverNullList1) {
this.myNeverNullList1 = myNeverNullList1==null? Lists.newArrayList():myNeverNullList1;
}
public void setMyNeverNullList2(List<String> myNeverNullList2) {
//OOPS, I forgot to put the null check here, should be caught by Unit Tests
this.myNeverNullList2 = myNeverNullList2;
}
}
我通过单元测试在单元测试中测试这种行为,但为每个集合编写这样简单的测试是很繁琐的。是否有任何库可以帮助我自动测试这种行为?
答案 0 :(得分:2)
通用答案是:让你的字段成为最终版,然后不允许稍后设置。然后编译器完成所有检查。 换句话说:默认情况下,制定对象不可变的政策;如果你有充分的理由,只会偏离该政策。
如果有充分的理由在您的班级中拥有多个“可设置”列表 (老实说:我无法想到)然后,下一个最好的事情是编写一个“仅测试”反射实用程序,它使用反射来获取具有匹配setter的所有列表/集合字段...首先调用setter with null,然后检查该字段是否为空。
答案 1 :(得分:1)
您可以使用反射生成测试。例如您可以拥有一个类列表,检查构造函数和实例方法,在setter上查找集合,并在传递null
值时检查它们是否按预期运行。编写测试后,您只需要应用此检查的所有类的列表。