将私有方法更改为受保护或私有用于单元测试 - 好还是坏?

时间:2016-11-14 05:13:44

标签: unit-testing tdd

我正在研究TDD并且最近正在搜索如何正确地对私有方法进行单元测试。 Stack Overflow中的热门答案暗示:

  • 使用反射可以从外部访问私有方法。 1
  • 不要测试私有方法。 (改为使用公共方法。)1 2 3

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

  • 制作private方法protectedpackage private。将测试代码放在同一个包中。
      

    设计可测试性意味着设计代码以便更容易测试。要做到这一点,你可能不得不打破我们在大学里学到的一些原则,比如封装。

尽管TDD的原则是为可测试性设计代码,但破坏封装对我来说听起来并不合适。这种方法是一个很好的方法吗?

2 个答案:

答案 0 :(得分:2)

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

  • 该方法不必是私有的:也许可以通过它所在的对象的API来访问该方法。在这种情况下,将其更改为公共(或其他任何非私人)。另一个选择是你将方法的行为放在另一个对象的公共方法中,然后为它构建一些专用测试;
  • 该方法必须是私有的,因此您正在测试不应该的东西。您正在尝试编写与您正在测试的对象耦合的测试。根据定义,私有方法不稳定,它们可能会在一段时间内频繁更改。这些更改将打破每个直接验证私有方法的测试。

答案 1 :(得分:0)

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

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