本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

What’s the best way of unit testing private methods?

我是一个初学者,我不知道如何编写一个适合单元测试的结构良好的应用程序。我想编写能够在以后添加有效单元测试的应用程序。

问题出在private方法上——它们不能在类外进行测试。

我应该通过将private的所有方法更改为protected来解决这个问题,并让测试类扩展源类吗?还是有更好的解决方案?

我的解决方案(private splitletters=>protected splitletters)的工作方式如下:

源类:

class MyClass{
protected splitLetters(int num){
return num+2;
}
}

测试类:

class Test_MyClass extend MyClass{
public splitLettersTest(){
for(int i=0;i<100;i++){
System.println(parent.splitLetters(i));
}
}
}

解决:

不测试私有方法-有时私有方法执行的任务非常复杂,应该测试得很好,我们不希望用户能够访问这些方法。很快,解决方案就是将私有方法改为受保护。

测试的嵌套类方法-有问题,因为QA更改了源代码

反射-如果这使得调用私有方法成为可能,那么它看起来是一个很好的解决方案http://www.artima.com/suiterner/private3.html(我应该学习更多的知识来理解思考。如果我们可以从另一个类调用私有方法,我不理解反射如何不打破拥有公共和私有方法的所有想法。)

不定义私有方法(如我在解决方案中所示)-有问题,因为有时我们必须定义私有方法。

许多人认为私有方法不需要测试,只需要公共接口。

这个问题已经在这里回答了。

stackoverflow.com/questions/34571/&hellip;副本

您不需要测试私有方法。

私有方法是实现的一部分。您不应该测试实现,而应该测试功能。如果测试类公开的功能,则可以在依赖单元测试的情况下更改实现。

如果您觉得需要测试私有方法,这是一个很好的迹象,表明您应该将私有方法移到另一个类中,并将该方法公开。通过这样做,您可以得到更小的类,并且可以轻松地测试方法。如果不想公开这个新类,可以将其设置为包私有(默认访问修饰符)。

+1.为了更好地解释为什么这是一个设计问题,以及如何解决它。

我个人的观点是,您应该(在可能的情况下)只测试向该功能的最终用户公开的行为,因此您不应该测试私有方法:

这个测试并不能证明任何东西,除了证明一个内部功能正在"工作",根据一些对实际使用您的软件的人来说毫无意义的东西。

如果您更改/重新考虑您的内部实现,您可能会发现您的单元测试开始失败,而实际上公开的外部功能根本没有更改!

当然,您可以选择将大型项目细分为更小的功能块,在这种情况下,您可以选择对接口之间的接口进行单元测试(例如,您可以选择对数据访问层进行单元测试,尽管DAL实现不会直接影响最终用户)。

测试私有方法意味着测试实现,而不是功能。仔细考虑一下为什么你要测试私有方法,你可能会发现你根本不需要测试它们。

您不需要测试私有方法。当你测试你的公共方法时,理论上,这些方法也应该测试你的私有方法。

在我看来,私人方法不应该被测试。测试是为了接口(在这个词的广义上)。