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

java中的单元测试私有和静态方法,java,android,unit-testing,static,private,Java,Android,Unit Testing,Static,Private,我正在为我的一个应用程序编写单元测试,作为一种良好的实践,我尝试使我的类中的所有方法尽可能私有,因此我可能最终得到的类大多是私有方法,很少有公共方法,有时还会调用一些静态方法(我的其他类或一些TextUtil,等等) 我想知道如何测试我所有的类,因为Robolectric和Powermockito似乎扩展了单元测试中应该做的事情的边界,所以我试图只依赖Mockito和JUnit。我是否应该忽略所有私有和静态方法,以及偶然调用一些静态或私有方法的公共方法?或者如何回答?注意:这只是一般信息,因为您

我正在为我的一个应用程序编写单元测试,作为一种良好的实践,我尝试使我的类中的所有方法尽可能私有,因此我可能最终得到的类大多是私有方法,很少有公共方法,有时还会调用一些静态方法(我的其他类或一些TextUtil,等等)


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

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

由于私有方法通常不可在类之外访问(反射完全是另一回事),并且通常是为了向公共和受保护的方法提供功能,所以单元测试只需要测试公共和受保护的方法。如果仔细选择测试数据,您应该能够执行大部分/所有代码

您可以使用Mockito模拟被测类所需的任何依赖项。您可以使用期望(
Mockito.when(…)。然后返回(…)
Mockito.verify(mockedClass).method(…)
)来模拟外部功能或检查被测类是否按预期发出调用

您可以使用断言检查正在测试的方法是否返回适当的值


但是请记住,当您第一次尝试更改被测类的内部实现时,具有高代码覆盖率的详细单元测试很可能会失败。这是一种平衡行为,您需要找到正确的覆盖级别,同时最小化测试的脆弱性。

您正在测试的类中的所有私有方法都应该由一些公共/受保护/包私有方法调用;否则它们是未使用的代码。因此,只需集中精力测试这个对应用程序的“客户端代码”可见的公共API。内部(私有方法)将作为副作用进行测试/覆盖,因为它们实际上实现了API指定的公共契约


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

这是两个截然不同的问题。通常,私有成员应该通过公共接口进行间接测试,静态方法通常是可独立测试的。谢谢您的回答。我真的想到了这一点,但在我的脑海里听起来似乎有点错误,因为如果我有一个公共方法,它也调用一个私有方法,我测试前者来捕获它们,我会觉得我不再测试“单元”,而是一个“集成”——单元测试中的“单元”定义并不总是那么简单。但总的来说,我认为如果您专注于测试类的公共接口,并将实现细节封装得很好,那么从长远来看事情会变得更容易。如果您觉得私有方法正在做您想专门测试的事情,可能这意味着这个逻辑应该在它自己的类中建模,然后可以(公开)单独进行单元测试。@kioli“它觉得我不再测试一个“单元”,而是一个“集成”-这里的问题是什么是单元?我喜欢Roy Osherove的定义:一个单元是一堆代码,它们有着相同的改变原因。这意味着一个单元可以是一个方法,也可以是几个类。非常感谢,我将尝试在我已经准备好的所有测试中使用这种方法谢谢你的回答,我对上面的答案进行了评论,为什么我认为跳过直接私有方法测试可能是错误的