Java 单元测试生成器方法

Java 单元测试生成器方法,java,unit-testing,Java,Unit Testing,我实现了一个新类Holder。目标如下: 三个领域。字段1和2是整数,字段3是布尔值 一旦建造,它将不会改变(不变)。因此,字段将只有getter 通过从5种可能的类型(字符串格式1、字符串格式2、int、类类型A和类类型B)中提取信息来初始化字段1和2。字段3设置为真/假 这给我留下的问题是有50种可能的构造函数选项。5 X 5 X 2。这既不合理也不可扩展(添加第6种类型,我将不得不编写一个巨大的更改),因此我使用了构建器模式: class Builder { Builder s1S

我实现了一个新类Holder。目标如下:

  • 三个领域。字段1和2是整数,字段3是布尔值
  • 一旦建造,它将不会改变(不变)。因此,字段将只有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初始化的生成器方法和一个用于布尔值的生成器方法。设置字段后,调用build()方法,该方法使用格式正确的字段调用私有构造函数并返回一个新对象

    我的问题是单元测试。我想建立一个列表,其中填充了一个代表性的对象,该对象是用构建器方法的每个排列构建的。现在我又回到了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;
    

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

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

    取而代之的是,使用等价划分将这些排列分类为一组较小的等价类,并且每个等价类只有一个测试用例。利用您对代码正在解决的问题和编写方式的了解(如果您正在测试其他人的代码,则可能会编写),选择一组具有以下特性的等价类:如果程序在等价类中的一个测试用例中正确运行,if很可能适用于课堂上的所有其他情况。这提供了经济高效的测试用例


    在您的情况下,我将单独测试
    build()
    ,然后对
    setXXX()
    方法和
    build()
    方法各测试一次

    为什么需要测试每个排列?为什么不分别测试生成器的每个setXxx()方法,然后测试build方法呢?我已经对这个示例进行了简化。在后台有一些生成器规则,说明在调用build()时,如何根据另一个和布尔值的状态解释setField1和setField2。@JBNizet在这里肯定是正确的-看起来您需要能够分解问题,以便分别测试不同的部分。不同的方法可能会使单独测试不同的部分变得更容易——尽管如果没有更详细的示例来理解不同的现场构建者是如何交互的,很难说这是什么。