将私有方法更改为受保护或包私有以进行单元测试 - 好还是坏?
Changing private methods as protected or package private for unit test - good or bad?
我正在研究 TDD,最近正在寻找如何正确地对私有方法进行单元测试。 Stack Overflow 中的热门答案建议:
- 使用反射使私有方法可以从外部访问。 1
- 不要测试私有方法。 (改为使用 public 方法。)1 2 3
根据评论区的分歧,似乎每个人都有自己的规则。然后我发现这个 tutorial site 提出了一个相当大胆的方法。
- 制作
private
方法 protected
或 package private
。将测试代码放在同一个包中。
Designing for testability means designing your code so that it is easier to test. To do so, you may have to break with some of the principles we learned in university, like encapsulation.
尽管 TDD 的原则是为可测试性设计代码,但为此打破封装并不适合我。这种方法是好的做法吗?
如果您可以将 Guava 库添加为依赖项,则可以创建方法 package private
并使用 VisibleForTesting 注释对其进行标记。
我假设您正在使用 Java,尽管您没有明确说明。
我认为正确的答案是:不要测试私有方法。
如果您觉得需要测试私有方法,可能正在发生以下两种情况之一:
- 该方法不必是私有的:也许可以通过其所在对象的 API 访问该方法。在这种情况下,将其更改为 public(或其他非私有的内容)。另一种选择是将方法的行为放在另一个对象的 public 方法中,并为其构建一些专用测试;
- 该方法必须是私有的,因此您正在测试不应该进行的测试。您正在尝试编写与您正在测试的对象过于耦合的测试。根据定义,私有方法并不稳定,它们会随着时间的推移而频繁变化。这些更改将破坏所有直接验证私有方法的测试。
我正在研究 TDD,最近正在寻找如何正确地对私有方法进行单元测试。 Stack Overflow 中的热门答案建议:
- 使用反射使私有方法可以从外部访问。 1
- 不要测试私有方法。 (改为使用 public 方法。)1 2 3
根据评论区的分歧,似乎每个人都有自己的规则。然后我发现这个 tutorial site 提出了一个相当大胆的方法。
- 制作
private
方法protected
或package private
。将测试代码放在同一个包中。Designing for testability means designing your code so that it is easier to test. To do so, you may have to break with some of the principles we learned in university, like encapsulation.
尽管 TDD 的原则是为可测试性设计代码,但为此打破封装并不适合我。这种方法是好的做法吗?
如果您可以将 Guava 库添加为依赖项,则可以创建方法 package private
并使用 VisibleForTesting 注释对其进行标记。
我假设您正在使用 Java,尽管您没有明确说明。
我认为正确的答案是:不要测试私有方法。 如果您觉得需要测试私有方法,可能正在发生以下两种情况之一:
- 该方法不必是私有的:也许可以通过其所在对象的 API 访问该方法。在这种情况下,将其更改为 public(或其他非私有的内容)。另一种选择是将方法的行为放在另一个对象的 public 方法中,并为其构建一些专用测试;
- 该方法必须是私有的,因此您正在测试不应该进行的测试。您正在尝试编写与您正在测试的对象过于耦合的测试。根据定义,私有方法并不稳定,它们会随着时间的推移而频繁变化。这些更改将破坏所有直接验证私有方法的测试。