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

可能的重复:单元测试私有方法的最佳方法是什么?

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

问题在于方法 - 它们不能在类之外进行测试。private

我是否应该通过更改 to 的所有方法来解决此问题,并让测试类扩展源类?还是有更好的解决方案?privateprotected

我的解决方案(私有拆分字母 =>受保护的拆分字母)的工作方式如下:

源类:

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. 不定义私有方法(正如我在解决方案中所示) - 有问题,因为有时我们必须定义私有方法。


答案 1

您不需要测试私有方法。

  • 私有方法专门是实现的一部分。您不应测试实现,而应测试功能。如果测试类公开的功能,则可以根据单元测试更改实现。
  • 如果您觉得需要测试私有方法,这是一个好兆头,表明您应该将私有方法移动到另一个类并使该方法公开。通过这样做,您可以获得更小的类,并且可以轻松测试这些方法。如果不想公开此新类,可以将其设置为包专用(默认访问修饰符)。

答案 2

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


推荐