junit & java:测试非公共方法

2022-08-31 09:48:05

JUnit 只会在我的类中测试那些公共方法。如何对那些不受保护的(即私有的、受保护的)进行 junit 测试?

我可以通过不使用junit来测试它们,但我想知道junit标准方法是什么。


答案 1

关于单元测试的一个思想流派说,你应该只能测试公共方法,因为你应该只对你的公共API进行单元测试,通过这样做,你应该在你的非公共方法中覆盖代码。您的里程可能会有所不同;我发现有时是这样,有时不是这样。

话虽如此,有几种方法可以测试非公共方法:

  • 通过将单元测试与它们正在测试的类放在同一包中,可以测试受保护方法和包范围的方法。这是一种相当普遍的做法。
  • 通过创建受测类的子类,重写要作为公共测试的方法,并让这些重写的方法使用 super 关键字调用原始方法,可以测试来自另一个包中的单元测试的受保护方法。通常,这个“测试子类”将是执行测试的 JUnit TestCase 类中的一个内部类。在我看来,这有点笨拙,但我已经做到了。

希望这有帮助。


答案 2

与许多单元测试问题一样,测试私有方法实际上是一个伪装的设计问题。当我发现自己希望为私有方法编写测试时,我没有尝试做任何棘手的事情来测试私有方法,而是花一分钟时间问自己,“我需要如何设计这个,以便我可以通过公共方法对其进行彻底测试?

如果这不起作用,JUnitX允许测试私有方法,尽管我相信它仅适用于JUnit 3.8。


推荐