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

Yos*_*sef 22 java testing junit automated-tests unit-testing

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

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

问题在于private方法 - 它们无法在类之外进行测试.

我应该改变是所有的方法解决这个问题privateprotected,让测试类扩展源类?或者有更好的解决方案吗?

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

来源类:

class MyClass{
  protected splitLetters(int num){
    return num+2;
  }
}
Run Code Online (Sandbox Code Playgroud)

测试类:

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

解决方案:

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

  2. 嵌套类测试方法 - 有问题,因为QA在源代码中进行了更改

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

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

Sjo*_*erd 37

您不应该测试私有方法.

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

  • +1可以很好地解释为什么这是一个设计问题,以及如何解决它. (2认同)

for*_*ret -3

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