【问题标题】:How should I test private methods in Java? [duplicate]我应该如何在 Java 中测试私有方法? [复制]
【发布时间】:2011-03-18 23:36:13
【问题描述】:

可能重复: What’s the best way of unit testing private methods?

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

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

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

我的解决方案(私有 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. Reflection - 如果这使得调用私有方法成为可能,它看起来是一个很好的解决方案http://www.artima.com/suiterunner/private3.html (我应该学习更多来理解反射。如果我们可以从另一个类调用私有方法,我不明白反射如何不打破拥有公共和私有方法的所有想法。)

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您应该不需要测试私有方法。

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

      【讨论】:

      • +1 很好地解释了为什么这是一个设计问题,以及如何解决它。
      • 我不同意。如果我想确定我的代码,我想测试代码流经过的每一部分。 Unit 甚至可以是实现自包含逻辑的私有方法。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我个人的观点是,您应该(尽可能)只测试向该功能的最终用户公开的行为,因此您不应该测试私有方法:

        1. 该测试并不能证明任何事情,只是表明某项内部功能根据实际使用您的软件的人没有意义的某些内容正在“工作”。

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

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

        【讨论】:

          猜你喜欢
          • 2019-01-23
          • 1970-01-01
          • 2019-11-18
          • 1970-01-01
          • 1970-01-01
          • 2017-06-06
          • 2015-02-26
          • 2019-03-10
          相关资源
          最近更新 更多