将私有方法更改为受保护或包私有以进行单元测试 - 好还是坏?

Changing private methods as protected or package private for unit test - good or bad?

我正在研究 TDD,最近正在寻找如何正确地对私有方法进行单元测试。 Stack Overflow 中的热门答案建议:

根据评论区的分歧,似乎每个人都有自己的规则。然后我发现这个 tutorial site 提出了一个相当大胆的方法。

尽管 TDD 的原则是为可测试性设计代码,但为此打破封装并不适合我。这种方法是好的做法吗?

如果您可以将 Guava 库添加为依赖项,则可以创建方法 package private 并使用 VisibleForTesting 注释对其进行标记。

我假设您正在使用 Java,尽管您没有明确说明。

我认为正确的答案是:不要测试私有方法。 如果您觉得需要测试私有方法,可能正在发生以下两种情况之一:

  • 该方法不必是私有的:也许可以通过其所在对象的 API 访问该方法。在这种情况下,将其更改为 public(或其他非私有的内容)。另一种选择是将方法的行为放在另一个对象的 public 方法中,并为其构建一些专用测试;
  • 该方法必须是私有的,因此您正在测试不应该进行的测试。您正在尝试编写与您正在测试的对象过于耦合的测试。根据定义,私有方法并不稳定,它们会随着时间的推移而频繁变化。这些更改将破坏所有直接验证私有方法的测试。