gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:55:29 27 4
gpt4 key购买 nike

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

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

  • 这给我留下的问题是有 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 初始化的构建器方法和一个用于 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com