3 回答
TA贡献1779条经验 获得超6个赞
注意:
此答案最初是针对以下问题而发布的:单独进行单元测试是否是通过getter公开私有实例变量的充分理由?它已合并到此示例中,因此可能是针对此处显示的用例的一点点。
一般而言,我通常都会重构“生产”代码以使其更易于测试。但是,我认为这不是一个好电话。一个好的单元测试(通常)通常不必关心类的实现细节,而只关心其可见行为。不必将内部堆栈暴露给测试,而是可以测试该类在调用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());
}
}
TA贡献1877条经验 获得超1个赞
就个人而言,我宁愿使用公共API进行单元测试,并且我绝对不会公开私有方法只是为了使其易于测试。
如果您真的想单独测试私有方法,则可以在Java中使用Easymock / Powermock来执行此操作。
您必须对此务实,并且还应该知道难以测试的原因。
' 听测试 '-如果很难测试,是否告诉您有关您的设计的一些信息?您能否将这种方法的测试重构到可以通过公共api进行测试的地方并轻松覆盖?
这就是迈克尔·费瑟斯(Michael Feathers)在“ 有效地使用旧版代码 ”中所说的话
“许多人花费大量时间试图解决该问题……真正的答案是,如果您有测试专用方法的冲动,则该方法不应该是专用的;如果将该方法公开,麻烦您了,可能是因为它是单独职责的一部分;它应该在另一个类上。” [ 有效地使用旧法典(M. Feathers,2005年)]
添加回答
举报