单元测试构建器方法

时间:2013-05-29 16:44:08

标签: java unit-testing

我已经实施了一个新课程,Holder。以下是目标:

  1. 三个领域。字段1和2是整数,字段3是布尔值。
  2. 构建后,不得更改(不可变)。因此,这些字段只有getter。
  3. 通过从5种可能的类型,字符串格式1,字符串格式2,int,类类型A和类类型B中提取信息来初始化字段1和字段2.字段3设置为true / false。
  4. 这让我失望的问题是有50种可能的构造函数选项。 5 X 5 X 2.这是不合理的或可扩展的(添加第6种类型,我必须写一个巨大的变化),所以我使用了一个构建器模式:

    class Builder {
        Builder s1SetField1(String Format1),
        Builder s2SetField1(String Format2),
        ...
        Builder s1SetField2(String Format1),
        ...
        Builder setField3(boolean b)
        Holder build()
    }
    

    这非常有效。我有5个用于字段1初始化的构建器方法,5个用于字段2初始化的构建器方法和一个用于布尔值的构建器方法。设置字段后,调用build()方法,该方法使用格式正确的字段调用私有构造函数并返回一个新对象。

    我遇到的问题是单元测试。我想设置一个列表,其中填充了使用Builder方法的每个排列构建的代表对象。现在我回到50个新的Build()调用。 我考虑创建3个列表 - field1List,field2List和field3List。然后,分层次地遍历每一个:

    for (Object f1 : field1List) {
        for (Object f2 : field2List) {
            for (boolean f3 : field3List) {
                returnList.add(new Builder().setField1(f1).setField2(f2).setField3(f3).build());
            }
        }
    }
    return returnList;
    

    当然,在列表中持有混合对象似乎很笨拙。是否有更好的方法来初始化每个排列?

1 个答案:

答案 0 :(得分:3)

尝试测试系统输入的每个排列都是疯狂的。对于即使是小型系统,排列的数量也很大。

而是使用等价分区将这些许多排列分类为一组较小的等价类,并且每个等价类只有一个测试用例。使用您对代码所解决问题的解释以及编写代码的方式(或者如果您正在测试其他人的代码,可能会编写代码)来选择一组具有如下属性的等价类,如果程序正常工作等价类中的一个测试用例,如果很可能对类中的所有其他情况正常工作。这提供了具有成本效益的测试用例。

在您的情况下,我会单独测试build (),并为setXXX ()方法后面的每个build ()方法测试一次。