关于单元测试:我应该如何在Java中测试私有方法?

How should I test private methods in Java?

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

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

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

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

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

我的解决方案(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实现不会直接影响最终用户)。


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


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


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