当前位置: 首页 > 知识库问答 >
问题:

单元测试生成器方法

郎弘业
2023-03-14

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

  1. 三个领域。字段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;

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

共有1个答案

宰父霖
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 有什么工具可以自动生成 Java 代码的单元测试? 更新: 主要用途是为将要重构的遗留代码快速生成单元测试。自动生成后,无需自动使测试与代码保持同步。 在这里提出了几乎相同的问题,但是答案是.NET而不是Java(Pex是公认的答案): 问题答案: CodePro Analytix有一个JUnit测试生成模块,听起来像它可以完成您想要的。请参阅《用户指南》。 [CoView]是价格合理

  • 我目前正在与CDI Unit合作一个项目,我遇到了一个奇怪的问题。我试图在一个简单的项目中重现它: 我有一个使用CdiRunner运行的测试类(如下所述:http://jglue.org/cdi-unit-user-guide/我的测试类注入了被测试的单元:UUD。这个类扩展了一个超级类“ParentTestClass”,它目前是无用的。 测试课。爪哇: 正如我提到的,父类是空的。 ParentT

  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet

  • 我有一个有很多测试文件的项目。在其中一个测试类中,我需要模拟最终类。正如我发现它可以通过MockMaker(link)完成,但是这破坏了我的所有其他测试类,原因如下: 没有模拟生成器,所有其他测试都可以。 如何指定仅在单个测试类上使用MockMaker?

  • 问题内容: 我有以前具有大量方法的类,因此我将此方法的工作细分为“辅助”方法。 这些辅助方法声明为强制执行封装- 但是我想对大型公共方法进行单元测试。是否也可以对辅助方法进行单元测试,好象其中的一个失败,而调用它的公共方法也会失败,这样我们就可以确定为什么失败了? 另外,为了使用模拟对象测试这些对象,我需要将其可见性从私有更改为受保护,这是否可取? 问题答案: 一种方法是省略测试并将其放在同一程序

  • 测试失败,因为为。为什么不以阻塞的方式在ViewModel中运行块? 我知道,如果将其转换为返回对象的方法,则可以通过调用获取对象,或者可以返回并调用。但是,我想通过将我的ViewModel方法保留为函数来实现这一点,有没有办法做到这一点呢?