【问题标题】:Unit testing legacy code with multiple constructors but no getter methods使用多个构造函数但没有 getter 方法对遗留代码进行单元测试
【发布时间】:2025-12-21 21:05:11
【问题描述】:

我正在尝试对一段代码进行单元测试(在 java 中),该代码具有多个构造函数,其中一些具有逻辑。所以除了设置一些字段之外,构造函数可能会根据满足的某些条件影响某些静态对象。我想知道如何对这些进行测试,因为代码不提供任何 getter 方法并且字段是私有的。我也无权更改原始代码。我可以查看是否重复我为每个构造函数所做的每个测试的一种方法,但似乎应该存在更好的解决方案。我在这个网站上看到了一些解决方案,也看到了其他一些针对具有多个构造函数的单元测试类的解决方案,但我没有找到任何完全符合我的情况的解决方案。

【问题讨论】:

  • 我在您的问题中添加了 java 标签以引起更多关注,因为 SO 上的很多人都按标签过滤,而您的构造函数标签的关注者很少。

标签: java unit-testing constructor multiple-constructors


【解决方案1】:

对其进行单元测试的目标是确保对象对于所有可能的输入行为正确,并且始终处于一致的预期状态。它在开发类和模块时特别有价值。没有吸气剂应该没什么区别。

在您的情况下,我建议在所有构造函数(正常值、疯狂值、空值、边缘情况等)中抛出大量参数组合,并确保生成的对象按预期运行。按预期行事可能意味着正常运行、正常失败或引发适当的异常。

当然,对象除了构造函数之外还有一些方法,所以你应该在你的测试中包含这些方法。如果对象有任何副作用,您可以检查它们是否按预期发生。

最后,即使您不能随意更改代码,也许您可​​以通过添加一些额外的方法来扩展它,这些方法的唯一目的是促进单元测试。如果不更改规则是您组织的简单编码策略,那么添加旨在提高质量的方法肯定是可以的。

另一方面,如果您真的无法更改代码,为什么还要进行单元测试呢?如果您无法更改代码,则无法修复单元测试可能发现的任何错误。

【讨论】:

  • 感谢您的回答。我无权更改代码,但如果发现错误,我可以报告它们,组织中的其他人可以修复现有实施中的这些错误。是的,正如我上面所说,还有其他方法,我可以看到的一个解决方案是在测试每种方法时抛出所有可能的场景。这意味着测试的数量乘以我所比较的构造函数的数量,而我只有一个构造函数的情况。所以我认为在这种情况下人们可能会遵循更好的协议。
  • 我不会担心测试的绝对数量。由于 Java 的自省 API,以及被测试类的合理参数的一些知识,开发一个程序来迭代每个构造函数/方法的许多参数组合是很简单的。是的,可能有成千上万的排列,但那又怎样?这就是计算机的用途。您只需为失败的测试打印一条消息。
【解决方案2】:

这些构造函数所做的所有工作都有一定的影响,对吧?所以测试它的效果。在那些静态物体上?检查那些。关于对象的后续行为?测试一下。

【讨论】: