java - 对构建器方法进行单元测试

标签 java unit-testing

我已经实现了一个新类,Holder。以下是目标:

  1. 三个字段。字段 1 和 2 是整数,字段 3 是 boolean 值。
  2. 一旦构建,就不会改变(不可变)。因此这些字段将只有 getter。
  3. 通过从 5 种可能的类型(字符串格式 1、字符串格式 2、int、类类型 A 和类类型 B)中提取信息来初始化字段 1 和 2。字段 3 设置为 true/false。

这给我留下的问题是有 50 个可能的构造函数选项。 5 X 5 X 2。这是不合理或可扩展的(添加第六种类型,我必须编写一个巨大的更改),所以我使用了构建器模式:

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

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

我遇到的问题是单元测试。我想设置一个列表,其中填充了用 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;

当然,在列表中保存混合对象似乎很笨重。有没有更好的方法来使用每个排列进行初始化?

最佳答案

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

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

就您而言,我将单独测试 build (),并对每个 setXXX () 方法进行一次测试,后跟 build ( ) 方法。

关于java - 对构建器方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16819599/

相关文章:

Javascript:如何覆盖某些类中的公共(public)方法?

symfony - 使用 phpStorm 在 Symfony 3.2.4 中进行功能测试

java - Eclipse:显示方法列表(ctrl-space)时,有没有办法在该类中添加方法 - 粗体?

java - 无法在Eclipse中执行Gradle构建

java - 使用 LTI-CIVIL 库从网络摄像头捕获图像

java - 是否有一种不太详细的方法来默默地忽略 Java 单元测试中的特定嵌套异常?

unit-testing - 是否可以仅通过 cargo 测试运行单元测试?

java - 无法使用 Java 泛型选择合适的方法

java - java中的自增运算符

java - TestNG 在@DataProvider 方法中引发异常后跳过测试