2010-07-21 62 views
16

可能重复: What’s the best way of unit testing private methods?我应该如何测试Java中的私有方法?

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

问题出在private方法 - 他们不能在他们的课外进行测试。

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

我的解决方案(私人splitLetters =>保护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. 没有定义私人方法(正如我在我的解决方案中所展示的) - 存在问题,因为有时我们必须定义私有方法。

+8

许多人会认为私有方法不需要测试,只需要公开接口。 – David 2010-07-21 12:55:21

+1

重复的http://stackoverflow.com/questions/34571/whats-the-best-way-of-unit-testing-private-methods – onof 2010-07-21 12:57:12

+0

这个问题已经回答[这里](http://stackoverflow.com/问题/ 34571 /单位什么最最好的方式 - 的 - 测试 - 私有方法)。 – jevakallio 2010-07-21 12:55:56

回答

0

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

2

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

25

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

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

+1对于为什么这是一个设计问题以及如何解决这个问题有一个很好的解释。 – 2010-07-21 13:07:33

3

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

3

我个人的观点是,你应该(尽可能)只测试行为暴露于那块功能的最终用户,因此,你不应该测试私有方法:

  1. 测试除了证明某个内部功能是“正常工作”的,根据某些对实际使用软件的人毫无意义的内容来说,它并不能证明任何内容。

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

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

相关问题