我已经实施了一个新课程,Holder。以下是目标:
这让我失望的问题是有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;
当然,在列表中持有混合对象似乎很笨拙。是否有更好的方法来初始化每个排列?
答案 0 :(得分:3)
尝试测试系统输入的每个排列都是疯狂的。对于即使是小型系统,排列的数量也很大。
而是使用等价分区将这些许多排列分类为一组较小的等价类,并且每个等价类只有一个测试用例。使用您对代码所解决问题的解释以及编写代码的方式(或者如果您正在测试其他人的代码,可能会编写代码)来选择一组具有如下属性的等价类,如果程序正常工作等价类中的一个测试用例,如果很可能对类中的所有其他情况正常工作。这提供了具有成本效益的测试用例。
在您的情况下,我会单独测试build ()
,并为setXXX ()
方法后面的每个build ()
方法测试一次。