2016-11-14 111 views
1

我正在学习TDD,最近正在寻找如何正确测试私有方法的方法。 Stack Overflow中的流行答案提示:将私有方法更改为受保护或包私有单元测试 - 好还是不好?

  • 使用反射可以使私有方法从外部访问。 1
  • 不要测试私有方法。 (使用公共方法来代替。)123

根据注释部分分歧,似乎每个人都有自己的规则。然后我发现这个tutorial site暗示了一个相当大胆的方法。

  • 制造private方法protectedpackage private。把测试代码放在同一个软件包中。

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

尽管TDD的原则设计代码的可测试性,破坏了封装为不健全适合我。这种方法是一个好的方法吗?

+0

如果一定要我选择,我会选择测试覆盖率超过封装的任何一天。 – Robert

+0

@罗伯特但是,由于每一种私人方法都迫使我选择,是不是意味着不再有私人方法了? – user2652379

回答

2

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

  • 的方法还没有被私人:也许它确定,该方法可以通过对象的API来达到它驻留在哪里。在这种情况下,请将其更改为公开(或其他任何不公开的内容)。另一种选择是将方法的行为放入另一个对象的公共方法中,然后为其构建一些专门的测试;
  • 该方法必须是私有的,所以你正在测试你不应该的东西。您正在尝试编写与您正在测试的对象耦合的测试。私人方法根据定义并不稳定,它们可能在一段时间内频繁变化。这些更改将打破每个直接验证私有方法的测试。
+0

我不会像DTO那样单元测试过于琐碎的东西。但是“你正在测试的东西你不应该”对我来说有点新鲜。什么样的方法不应该被测试? – user2652379

+0

另一个问题。还有一些私人方法足够复杂,无法进行测试。我应该怎么做?如果可能的话,我的想法是将这种方法转移到一个新班级,并将其公开化。也许有更好的方法?或者没有解决方法,不应该测试? – user2652379

+0

我的意思是“你正在测试的东西你不应该”,可能你不需要为私有方法内部的逻辑做一个特定的测试。也许你可以通过创建一个测试来测试私有代码使用私有方法的代码的公共方法。通过这种方式,您正在有效地测试对象的公共行为,您正在测试某些属于公共API的方法,因此根据定义,它必须是稳定的。但是,因此,您还在测试需要执行的私有代码,以满足上述“公共行为”。 –

0

如果可以将Guava库作为依赖项添加,则可以使用方法package private并使用VisibleForTesting注释标记它。

我假设你使用的是Java,但你并没有明确指出。

相关问题