我应该如何在Java中测试私有方法?

时间:2010-07-21 12:53:58

标签: java unit-testing testing junit automated-tests

  

可能重复:   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));
  }
 }
}

解决方案:

  1. 不测试私有方法 - 有时私有方法正在执行非常复杂的任务,应该进行非常好的测试,我们不希望该用户可以访问此方法。很快,解决方案就是将私人方法改为受保护。

  2. 嵌套类测试方法 - 因QA在源代码中进行更改而出现问题

  3. 反思 - 如果这可以调用私有方法,它看起来像一个很好的解决方案http://www.artima.com/suiterunner/private3.html (我应该学习更多来理解反思。如果我们可以从另一个类调用私有方法,我不明白反射如何不会破坏公共和私有方法的所有想法。)

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

5 个答案:

答案 0 :(得分:36)

您不需要测试私有方法。

  • 私有方法是具体实现的一部分。您不应该测试实现,而是测试功能。如果您测试类暴露的功能,则可以根据单元测试更改实现。
  • 如果您觉得需要测试私有方法,这是一个好的迹象,您应该将私有方法移动到另一个类并使该方法公开。通过这样做,您可以获得更小的类,并且可以轻松地测试方法。如果您不想公开这个新类,可以将其设为package-private(默认访问修饰符)。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

我个人认为,您应该(尽可能)只测试暴露给该功能的最终用户的行为,因此您不应该测试私有方法:

  1. 除了显示一段内部功能根据对实际使用您的软件的人没有意义的东西“正常工作”之外,测试没有任何证据。

  2. 如果您更改/重新考虑内部实施因素,您可能会发现您的单元测试开始失败,而事实上暴露的外部功能根本没有改变!

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

答案 3 :(得分:2)

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

答案 4 :(得分:-3)

在我看来,私人方法不应该被测试。测试用于接口(在本词的广义上)。