单元测试所有集合不能为空的通用方法

时间:2016-08-25 12:09:14

标签: java unit-testing

我经常创建包含某种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;
    }
}

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

2 个答案:

答案 0 :(得分:2)

通用答案是:让你的字段成为最终版,然后允许稍后设置。然后编译器完成所有检查。 换句话说:默认情况下,制定对象不可变的政策;如果你有充分的理由,只会偏离该政策。

如果有充分的理由在您的班级中拥有多个“可设置”列表 (老实说:我无法想到)然后,下一个最好的事情是编写一个“仅测试”反射实用程序,它使用反射来获取具有匹配setter的所有列表/集合字段...首先调用setter with null,然后检查该字段是否为空。

答案 1 :(得分:1)

您可以使用反射生成测试。例如您可以拥有一个类列表,检查构造函数和实例方法,在setter上查找集合,并在传递null值时检查它们是否按预期运行。编写测试后,您只需要应用此检查的所有类的列表。