2017-09-13 138 views
1

我正在为我的一个应用程序编写单元测试,作为一个很好的练习,我尝试使我的类中的所有方法尽可能私有,所以我最终可能会得到大多数是私有的类方法,几个公共的,有时一些调用静态方法(我的其他类或一些TextUtils等)java中的单元测试私有和静态方法

我想知道如何去测试我所有的类只尝试依靠Mockito和因为Robolectric和Powermockito似乎在扩展单元测试应该完成的范围。我应该忽略所有私有和静态方法以及偶然调用某些静态或私有方法的公共方法吗?或者如何?

+2

这是两个非常不同的问题。通常,应该通过公共接口间接测试私有成员,而静态方法通常是可单独测试的。 – chrylis

+0

谢谢@chrylis – kioli

回答

2

您正在测试的类中的所有私有方法应该由一些public/protected/package私有方法调用;否则它们是未使用的代码。因此,只需专注于测试此应用的“客户端代码”可见的公共API。内部(私有方法)将作为副作用进行测试/覆盖,因为它们实际实现了API指定的公共契约。

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

+0

谢谢你的答案。我其实想到了这一点,但在我脑海中听起来有些不对劲,因为如果我有一种公共方法,也称为私人方法,我测试前者来捕捉它们,它感觉我不再测试一个“单元”,而是一个“合奏“ – kioli

+1

单元测试中的”单元“并不总是那么容易定义。但总的来说,如果您专注于测试您的类的公共接口并将实现细节保持良好封装,我认为从长远来看,这会让事情更轻松。如果你觉得私有方法正在做你想要特别测试的东西,也许这意味着这个逻辑应该在它自己的类中建模,然后可以(单独)公开地对它们进行单元测试。 –

+0

@kioli *“感觉我不再是测试一个”单元“而是一个”合奏“”** ** - **这里的问题是*什么是**单元**?*我喜欢Roy Osherove的定义:*一个单元是一组代码,它有相同的理由来改变。*这意味着一个单元可以是单一方法或几个类。 –

2

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

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

您可以使用Mockito来嘲笑被测试类所需的任何依赖关系。您可以使用期望值(Mockito.when(...).thenReturn(...)Mockito.verify(mockedClass).method(...))来模拟外部功能或检查被测试类是否按预期发出呼叫。

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

但请记住,具有高代码覆盖率的详细单元测试很有可能在您第一次尝试更改被测试类的内部实现时破坏。这是一个平衡的行为,你需要找到正确的覆盖水平,同时尽量减少测试的脆弱程度。

+0

感谢您的回答,我上面的回答评论为什么我认为它可能是错误的跳过直接私人方法测试 – kioli