版主注意: 这里已经发布了 39 个答案(有些已被删除)。在您发布您的答案之前,考虑是否可以在讨论中添加一些有意义的东西。你很可能只是在重复别人已经说过的话。
我偶尔会发现自己需要在一个类中公开一个私有(private)方法,只是为了为其编写一些单元测试。
通常这是因为该方法包含在类中的其他方法之间共享的逻辑,并且自己测试逻辑更整洁,或者另一个原因可能是我想测试同步线程中使用的逻辑而不必担心关于线程问题。
其他人发现自己这样做是因为我真的不喜欢这样做吗?我个人认为奖金超过了将方法公开的问题,该方法并没有真正提供类之外的任何服务......
更新
感谢大家的回答,似乎引起了人们的兴趣。我认为普遍的共识是测试应该通过公共(public) API 进行,因为这是使用类的唯一方式,我同意这一点。我上面提到的几个我会这样做的案例是不常见的情况,我认为这样做的好处是值得的。
但是,我可以看到每个人的观点,它不应该真的发生。再考虑一下,我认为更改代码以适应测试是一个坏主意-毕竟我认为测试在某种程度上是一种支持工具,如果愿意的话,将系统更改为“支持支持工具”是公然的不好的做法。
最佳答案
Note:
This answer was originally posted for the question Is unit testing alone ever a good reason to expose private instance variables via getters? which was merged into this one, so it may be a tad specific to the usecase presented there.
作为一般性声明,我通常完全支持重构“生产”代码以使其更易于测试。但是,我认为这不是一个好的选择。一个好的单元测试(通常)不应该关心类的实现细节,只关心它的可见行为。您可以测试该类在调用 first()
或 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());
}
}
关于c# - 将私有(private)方法公开以对其进行单元测试...好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7075938/