Java 单元测试的通用方法,所有集合都不能为null

Java 单元测试的通用方法,所有集合都不能为null,java,unit-testing,Java,Unit Testing,我经常创建包含某种集合(集合、列表等)的对象。它们永远不能为空。若构造函数或setter传递null,则创建空集合的新实例。下面是一个有错误的示例(由注释标记) package com.myapp; 导入com.google.common.collect.list; 导入java.util.List; 公共类MyClass{ 私有列表myNeverNullList1; 私有列表myNeverNullList2; 公共MyClass(列表myNeverNullList1、列表myNeverNull

我经常创建包含某种集合(集合、列表等)的对象。它们永远不能为空。若构造函数或setter传递null,则创建空集合的新实例。下面是一个有错误的示例(由注释标记)

package com.myapp;
导入com.google.common.collect.list;
导入java.util.List;
公共类MyClass{
私有列表myNeverNullList1;
私有列表myNeverNullList2;
公共MyClass(列表myNeverNullList1、列表myNeverNullList2){
this.myNeverNullList1=myNeverNullList1==null?Lists.newArrayList():myNeverNullList1;
this.myNeverNullList2=myNeverNullList2==null?Lists.newArrayList():myNeverNullList2;
}
public void setMyNeverNullList1(列表myNeverNullList1){
this.myNeverNullList1=myNeverNullList1==null?Lists.newArrayList():myNeverNullList1;
}
public void setMyNeverNullList2(列表myNeverNullList2){
//哎呀,我忘了在这里放空检查,应该被单元测试捕获
this.myNeverNullList2=myNeverNullList2;
}
}

我在一个单元测试一个单元测试中测试这种行为,但是为每个集合编写这样简单的测试是乏味的。是否有任何库可以帮助我自动测试这种行为?

您可以使用反射生成测试。e、 g.您可以有一个类列表,检查构造函数和实例方法,在setter上查找集合,并检查它们在传递
null
值时的行为是否符合预期。一旦你完成了测试,你所需要的就是一个列表,上面列出了这个检查应该应用到的所有类。

一般的答案是:将你的字段设置为最终字段,以后再做允许设置它。然后编译器为您执行所有检查。 换句话说:使您的策略在默认情况下对象是不可变的;只有在你有充分理由的情况下才偏离这一政策

如果有充分的理由在你的课堂上有多个“可设置”的列表
(老实说:我想不出来)那么下一个最好的方法就是编写一个“仅测试”反射实用程序,它使用反射来获取所有具有匹配setter的列表/集合字段。。。首先用null调用setter,然后检查字段是否为null。

这可能会对您有所帮助。您需要单独测试所有单元,所以长话短说-不,没有通用的方法验证应用程序中所有不为null的集合。如果有2个或N个集合需要验证,则需要编写2个或N个断言。是否确实需要替换整个列表?根据这种操作可能产生的副作用,这对我来说似乎非常危险……我宁愿在我的IDE中使用静态null检查(在我的例子中是eclipse),并使用javax.validation.constraints.NotNull为构造函数和setter注释参数。
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;
    }
}