可能重复:单元测试私有方法的最佳方法是什么?
我是一名初学程序员,我不知道如何编写一个结构良好的单元测试应用程序 . 我想编写能够在之后添加有效单元测试的应用程序 .
问题在于 private
方法 - 它们无法在类外部进行测试 .
我应该通过将 private
的所有方法更改为 protected
来解决此问题,并让测试类扩展源类吗?或者有更好的解决方案吗?
我的解决方案(private splitLetters => protected splitLetters)将如下工作:
Source class:
class MyClass{
protected splitLetters(int num){
return num+2;
}
}
Test class:
class Test_MyClass extend MyClass{
public splitLettersTest(){
for(int i=0;i<100;i++){
System.println(parent.splitLetters(i));
}
}
}
解决方案:
-
Not testing private methods - 有时私有方法正在执行非常复杂的任务,应该进行非常好的测试,我们不希望该用户可以访问这些方法 . 很快解决方案就是将私有方法改为受保护 .
-
Nested class way to test - 有问题,因为QA在源代码中进行了更改
-
Reflection - 如果这可以调用私有方法,它看起来像一个很好的解决方案http://www.artima.com/suiterunner/private3.html(我应该学习更多来理解反射 . 我不明白如果我们反思不会破坏所有的公共和私人方法的想法可以从另一个类调用私有方法 . )
-
Not define private methods (正如我在我的解决方案中所示) - 有问题,因为有时我们必须定义一个私有方法 .
5 回答
您不应该测试私有方法 .
私有方法是具体实现的一部分 . 您不应该测试实现,而是测试功能 . 如果测试类暴露的功能,则可以根据单元测试更改实现 .
如果您觉得需要测试私有方法,这是一个好的迹象,您应该将私有方法移动到另一个类并使该方法公开 . 通过这样做,您可以获得更小的类,并且可以轻松地测试方法 . 如果您不想公开这个新类,可以将其设为package-private(默认访问修饰符) .
测试私有方法意味着测试实现,而不是功能 . 仔细考虑为什么要测试私有方法,你可能会发现根本不需要测试它们 .
我个人认为,您应该(尽可能)只测试暴露给该功能的最终用户的行为,因此您不应该测试私有方法:
测试没有证明任何东西,除了表明一个内部功能是“工作”根据对实际使用你的软件的人没有意义的东西 .
如果您更改/重新考虑内部实施因素,您可能会发现您的单元测试开始失败,而实际上暴露的外部功能根本没有改变!
当然,您可以选择将大型项目细分为更小的功能块,在这种情况下,您可以选择对接口之间的接口进行单元测试(例如,您可能选择对数据访问层进行单元测试,尽管事实上是DAL实现不会直接影响最终用户) .
您不应该测试私有方法 . 当你测试你的公共方法时,理论上也应该测试你的私有方法 .
在我看来,私人方法不应该被测试 . 测试用于接口(在本词的广义上) .