3 回答

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
注意:
此答案最初是針對(duì)以下問題而發(fā)布的:?jiǎn)为?dú)進(jìn)行單元測(cè)試是否是通過getter公開私有實(shí)例變量的充分理由?它已合并到此示例中,因此可能是針對(duì)此處顯示的用例的一點(diǎn)點(diǎn)。
一般而言,我通常都會(huì)重構(gòu)“生產(chǎn)”代碼以使其更易于測(cè)試。但是,我認(rèn)為這不是一個(gè)好電話。一個(gè)好的單元測(cè)試(通常)通常不必關(guān)心類的實(shí)現(xiàn)細(xì)節(jié),而只關(guān)心其可見行為。不必將內(nèi)部堆棧暴露給測(cè)試,而是可以測(cè)試該類在調(diào)用first()或之后以您期望的順序返回頁(yè)面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貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
就個(gè)人而言,我寧愿使用公共API進(jìn)行單元測(cè)試,并且我絕對(duì)不會(huì)公開私有方法只是為了使其易于測(cè)試。
如果您真的想單獨(dú)測(cè)試私有方法,則可以在Java中使用Easymock / Powermock來執(zhí)行此操作。
您必須對(duì)此務(wù)實(shí),并且還應(yīng)該知道難以測(cè)試的原因。
' 聽測(cè)試 '-如果很難測(cè)試,是否告訴您有關(guān)您的設(shè)計(jì)的一些信息?您能否將這種方法的測(cè)試重構(gòu)到可以通過公共api進(jìn)行測(cè)試的地方并輕松覆蓋?
這就是邁克爾·費(fèi)瑟斯(Michael Feathers)在“ 有效地使用舊版代碼 ”中所說的話
“許多人花費(fèi)大量時(shí)間試圖解決該問題……真正的答案是,如果您有測(cè)試專用方法的沖動(dòng),則該方法不應(yīng)該是專用的;如果將該方法公開,麻煩您了,可能是因?yàn)樗菃为?dú)職責(zé)的一部分;它應(yīng)該在另一個(gè)類上。” [ 有效地使用舊法典(M. Feathers,2005年)]
添加回答
舉報(bào)