我正在为我的应用程序编写单元测试,并且作为一种良好的实践,我尝试尽可能使我的课程中的所有方法都是私有的,所以我最终可能会使用大多数私有方法的课程,很少有公共课程和有时会调用静态方法(我的其他类或某些TextUtils等)
我想知道如何测试我所有的类,只想依靠Mockito和JUnit,因为Robolectric和Powermockito似乎扩展了单元测试应该做的界限。我是否应该忽略所有私有和静态方法以及偶然称为静态或私有方法的公共方法?或者怎么样?
答案 0 :(得分:2)
注意:这只是一般信息,因为您的问题不提供评论代码。
由于私有方法通常不能在类之外访问(反射完全是另一个问题),并且通常在那里为您的公共和受保护方法提供功能,因此您的单元测试只需要测试您的公共和受保护方法。如果您仔细选择测试数据,您应该能够运用大部分/全部代码。
您可以使用Mockito来模拟所测试的类所需的任何依赖项。您可以使用期望值(Mockito.when(...).thenReturn(...)
或Mockito.verify(mockedClass).method(...)
)来模拟外部功能,或者检查被测试的类是否按预期进行传出呼叫。
您可以使用断言来检查正在测试的方法是否返回适当的值。
请记住,具有高代码覆盖率的详细单元测试很有可能在您第一次尝试更改被测试类的内部实现时中断。这是一种平衡行为,你需要找到合适的覆盖水平,同时尽量减少测试的脆弱程度。
答案 1 :(得分:2)
您正在测试的类中的所有私有方法都应该由一些public / protected / package私有方法调用;否则他们是未使用的代码。因此,只需专注于测试应用程序“客户端代码”可见的公共API。内部(私有方法)将作为副作用进行测试/覆盖,因为它们实际上实现了API指定的公共合同。
直接测试实现细节(私有方法)会使测试更难维护,而且测试代码更难以重构。