How should I test private methods in Java?
Possible Duplicate:
What’s the best way of unit testing private methods?
我是一个初学者,我不知道如何编写一个适合单元测试的结构良好的应用程序。我想编写能够在以后添加有效单元测试的应用程序。
问题出在
我应该通过将
我的解决方案(private splitletters=>protected splitletters)的工作方式如下:
源类:
1 2 3 4 5 | class MyClass{ protected splitLetters(int num){ return num+2; } } |
测试类:
1 2 3 4 5 6 7 | 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(我应该学习更多的知识来理解思考。如果我们可以从另一个类调用私有方法,我不理解反射如何不打破拥有公共和私有方法的所有想法。)
不定义私有方法(如我在解决方案中所示)-有问题,因为有时我们必须定义私有方法。
您不需要测试私有方法。
- 私有方法是实现的一部分。您不应该测试实现,而应该测试功能。如果测试类公开的功能,则可以在依赖单元测试的情况下更改实现。
- 如果您觉得需要测试私有方法,这是一个很好的迹象,表明您应该将私有方法移到另一个类中,并将该方法公开。通过这样做,您可以得到更小的类,并且可以轻松地测试方法。如果不想公开这个新类,可以将其设置为包私有(默认访问修饰符)。
我个人的观点是,您应该(在可能的情况下)只测试向该功能的最终用户公开的行为,因此您不应该测试私有方法:
这个测试并不能证明任何东西,除了证明一个内部功能正在"工作",根据一些对实际使用您的软件的人来说毫无意义的东西。
如果您更改/重新考虑您的内部实现,您可能会发现您的单元测试开始失败,而实际上公开的外部功能根本没有更改!
当然,您可以选择将大型项目细分为更小的功能块,在这种情况下,您可以选择对接口之间的接口进行单元测试(例如,您可以选择对数据访问层进行单元测试,尽管DAL实现不会直接影响最终用户)。
测试私有方法意味着测试实现,而不是功能。仔细考虑一下为什么你要测试私有方法,你可能会发现你根本不需要测试它们。
您不需要测试私有方法。当你测试你的公共方法时,理论上,这些方法也应该测试你的私有方法。
在我看来,私人方法不应该被测试。测试是为了接口(在这个词的广义上)。