我有void函數,不返回任何內容與if塊。單元測試是否有辦法驗證「if」塊是否被觸摸?測試如果與Mockito塊
例如測試「如果」以下funtion裏面:
public void doSomething(){
if(someCondition){
int foo = doThis();
}
// ----
// remaining code
}
private int doThis(){
return 100;
}
我有void函數,不返回任何內容與if塊。單元測試是否有辦法驗證「if」塊是否被觸摸?測試如果與Mockito塊
例如測試「如果」以下funtion裏面:
public void doSomething(){
if(someCondition){
int foo = doThis();
}
// ----
// remaining code
}
private int doThis(){
return 100;
}
在做單元測試要測試觀察到的行爲,不代碼。
觀察行爲可以是:
這些是testet通過公共接口 (CUT)。這些公共接口並不意味着公共方法,而是指預計將由代碼使用CUT調用的方法。
但問題是你的代碼不會改變對象的狀態,所以什麼都不能測試。
從技術上講,您可以提高getter方法的可見性並用Mockito對其進行模擬,但這與整個代碼一樣沒用。
修訂號
我寫這個是因爲OP有一個任務去做。我想強調的是,這是而不是它應該完成的方式。
作出觀察可見的測試類中的方法。 然後你可以使用普通功能的Mockito:
/*ClassUnderTest CUT */ public void doSomething(){ if(someCondition){ int foo = doThis(); } // ---- // remaining code } /* package private, test class should be in same package */ int doThis(){ return 100; } /* TestClass */ @Test public void doSomething__conditionTrue__callesMemberMethod(){ ClassUnderTest cut = Mockito.spy(new ClassUnderTest()); // anything needed to make the condition true cut.doSomething(); Mockito.verify(cut).doThis(); } @Test public void doSomething__conditionFalse__doesNotCallMemberMethod(){ ClassUnderTest cut = Mockito.spy(new ClassUnderTest()); // anything needed to make the condition false cut.doSomething(); Mockito.verify(cut,never()).doThis(); }
使用PowerMock(-ito)
但PowerMockito改變CUT的字節碼,因此,你真的arn't測試您的CUT。我強烈建議不要使用它,除非您必須測試否則無法測試的遺留代碼。
我明白,但有沒有辦法甚至做一些驗證如果doThis被稱爲? – vdk
請告訴請求者,這首先是單元測試的錯誤方法。 –
這似乎是與[此處的其他問題](http://stackoverflow.com/q/39975396/1426891)非常接近的重疊。標記爲重複,但請重新打開,如果您的主題非常不同(但不是如果它是與您的不同具體情況相同的主題)。 –
我認爲這是非常不同的。我只是想知道是否有辦法做一些事情,如驗證doThis是否被調用。 – vdk
這就是關鍵,但是:同樣的推理也是一樣的答案。私有方法和'if'塊是實現細節,儘管你可以使用部分模擬來驗證被測系統,但Mockito在將類作爲一個單元進行處理並測試它的API和外部協作(依賴項交互和返回值)時效果最好。 –