强>慢化剂注释: EM >已经有39个答案出现在这里(有些已经被删除)。在发布你的/EM>答案之前,考虑是否可以给讨论添加一些有意义的东西。你很可能只是重复别人说过的话。
我偶尔会发现自己需要在类中公开一个私有方法,以便为它编写一些单元测试
通常这是因为该方法包含类中其他方法之间共享的逻辑,并且它自己测试逻辑更整洁,或者另一个原因可能是我想测试同步线程中使用的逻辑,而不必担心线程问题
其他人会因为我不喜欢这样做而发现自己在这样做吗??我个人认为奖金超过了公开一个方法的问题,这个方法实际上不提供任何课外服务
更新
谢谢大家的回答,似乎激起了人们的兴趣。我认为普遍的共识是测试应该通过公共API进行,因为这是使用类的唯一方式,我同意这一点。我在上面提到的两个案例中,我会这样做,这是不常见的案例,我认为这样做的好处是值得的
然而,我可以看到每个人都认为这永远不会发生。再仔细考虑一下,我认为更改代码以适应测试是一个坏主意——毕竟,我认为测试在某种程度上是一种支持工具,如果您愿意,将系统更改为“支持支持工具”是明显的坏做法
注意:
此答案最初是针对问题单靠单元测试就可以通过getter公开私有实例变量吗 它被合并到这一个中,因此它可能是一个特定于这里介绍的用例的tad
一般来说,我完全支持重构“生产”代码以使其更易于测试。然而,我认为这不是一个好的决定。一个好的单元测试(通常)不应该关心类的实现细节,只关心它的可见行为。您可以在调用first()或last()后,测试类是否按照您期望的顺序返回页面,而不是将内部堆栈公开给测试
例如,考虑这个伪代码:
公共类导航测试{
私人导航;
@以前
公共作废设置(){
//设置导航,使订单为第1页->;第2页->;第3页和
//我们回到第二页
导航=。。。;
}
@试验
公共void testFirst(){
导航第一();
assertEquals(“page1”,nav.getPage());
导航下一步();
assertEquals(“page2”,nav.getPage());
导航下一步();
assertEquals(“第3页”,nav.getPage());
}
@试验
公共void testLast(){
nav.last();
assertEquals(“第3页”,nav.getPage());
上一页导航();
assertEquals(“page2”,nav.getPage());
上一页导航();
assertEquals(“page1”,nav.getPage());
}
}