java 中的单元测试私有和静态方法

Unit test private and static methods in java

我正在为我的一个应用程序编写单元测试,作为一种好的做法,我尝试使我的 类 中的所有方法尽可能私有,所以我最终可能会 类主要是私有方法,少数 public 个,有时还有一些静态方法调用(我的其他 类 或某些 TextUtils 等)

我想知道如何测试我所有的 类 尝试只依赖 Mockito 和 JUnit,因为 Robolectric 和 Powermockito 似乎扩展了应该做的事情的界限单元测试。我是否应该忽略所有私有和静态方法以及 public 偶然调用某些静态或私有方法的方法?或者怎么做?

注意:这只是一般信息,因为您的问题没有提供评论代码。

由于私有方法通常无法在 class 之外访问(反射完全是另一回事)并且通常在那里为您的 public 和受保护的方法提供功能,因此您的单元测试只需要测试您的 public 和受保护的方法。如果你仔细选择你的测试数据,你应该可以练习 most/all 的代码。

您可以使用 Mockito 模拟被测 class 需要的任何依赖项。您使用期望值(Mockito.when(...).thenReturn(...)Mockito.verify(mockedClass).method(...))模拟外部功能或检查被测 class 是否按预期进行传出呼叫。

您可以使用断言来检查正在测试的方法return 适当的值。

但是请记住, 具有高代码覆盖率的详细单元测试在您第一次尝试更改 class 正在测试中。这是一种平衡行为,您需要找到合适的覆盖级别,同时尽量减少测试的脆弱性。

您正在测试的 class 中的所有私有方法都应该由某些 public/protected/package 私有方法调用;否则它们是未使用的代码。因此,只需专注于测试这个 public API 对您的应用程序的 "client code" 可见。内部(私有方法)将得到 tested/covered 作为副作用,因为它们实际上实现了 API 指定的 public 契约。

直接测试实现细节(私有方法)会使测试更难维护,被测代码更难重构。