Moderator Note: There are already 39 answers posted here (some have been deleted). Before you post your answer, consider whether or not you can add something meaningful to the discussion. You're more than likely just repeating what someone else has already said.
我偶尔发现自己需要在类中公开一个私有方法,只是为了为其编写一些单元测试。
通常这是因为该方法包含类中其他方法之间共享的逻辑,并且单独测试逻辑会更整洁,或者可能的另一个原因是我想测试同步线程中使用的逻辑而不必担心线程问题。
其他人是否发现自己这样做,因为我真的不喜欢这样做?我个人认为,好处超过了将方法公开的问题,该方法实际上并没有在类之外提供任何服务......
UPDATE
感谢大家的回答,似乎激起了人们的兴趣。我认为普遍的共识是测试应该通过公共 API 进行,因为这是使用类的唯一方式,我确实同意这一点。我上面提到的几个我会这样做的案例是不常见的案例,我认为这样做的好处是值得的。
然而,我可以看到每个人都认为这永远不应该发生。当更多地考虑它时,我认为更改代码以适应测试是一个坏主意 - 毕竟我认为测试在某种程度上是一种支持工具,并且如果您愿意的话,更改系统以“支持支持工具”是公然的不好的做法。
Note:
这个答案最初是针对这个问题发布的单独的单元测试是否是通过 getter 公开私有实例变量的好理由? https://stackoverflow.com/q/31646092/2422776它被合并到这个中,所以它可能有点特定于那里提出的用例。
作为一般性声明,我通常赞成重构“生产”代码以使其更易于测试。然而,我认为这不是一个好的选择。一个好的单元测试(通常)不应该关心类的实现细节,而只关心它的可见行为。您可以测试该类在调用后是否按照您期望的顺序返回页面,而不是将内部堆栈暴露给测试first()
or last()
.
例如,考虑这个伪代码:
public class NavigationTest {
private Navigation nav;
@Before
public void setUp() {
// Set up nav so the order is page1->page2->page3 and
// we've moved back to page2
nav = ...;
}
@Test
public void testFirst() {
nav.first();
assertEquals("page1", nav.getPage());
nav.next();
assertEquals("page2", nav.getPage());
nav.next();
assertEquals("page3", nav.getPage());
}
@Test
public void testLast() {
nav.last();
assertEquals("page3", nav.getPage());
nav.previous();
assertEquals("page2", nav.getPage());
nav.previous();
assertEquals("page1", nav.getPage());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)