2016-10-16 65 views
-3

我有void函數,不返回任何內容與if塊。單元測試是否有辦法驗證「if」塊是否被觸摸?測試如果與Mockito塊

例如測試「如果」以下funtion裏面:

public void doSomething(){ 
    if(someCondition){ 
     int foo = doThis(); 
    } 
    // ---- 
    // remaining code 
} 

private int doThis(){ 
    return 100; 
} 
+0

這似乎是與[此處的其他問題](http://stackoverflow.com/q/39975396/1426891)非常接近的重疊。標記爲重複,但請重新打開,如果您的主題非常不同(但不是如果它是與您的不同具體情況相同的主題)。 –

+0

我認爲這是非常不同的。我只是想知道是否有辦法做一些事情,如驗證doThis是否被調用。 – vdk

+0

這就是關鍵,但是:同樣的推理也是一樣的答案。私有方法和'if'塊是實現細節,儘管你可以使用部分模擬來驗證被測系統,但Mockito在將類作爲一個單元進行處理並測試它的API和外部協作(依賴項交互和返回值)時效果最好。 –

回答

1

在做單元測試要測試觀察到的行爲,不代碼

觀察行爲可以是:

  • 的(公共)接口方法返回值
  • 與其他對象的交互(依賴關係)的對象狀態的
  • 變化(通常吸氣劑的結果的變化)

這些是testet通過公共接口 (CUT)。這些公共接口並不意味着公共方法,而是指預計將由代碼使用CUT調用的方法。


在您的情況下,您希望在調用方法時測試對象的狀態更改作爲副作用。

但問題是你的代碼不會改變對象的狀態,所以什麼都不能測試。

從技術上講,您可以提高getter方法的可見性並用Mockito對其進行模擬,但這與整個代碼一樣沒用。

修訂號
我寫這個是因爲OP有一個任務去做。我想強調的是,這是而不是它應該完成的方式。


因爲要觀察的方法是私有的,你有兩個選擇:

  1. 作出觀察可見的測試類中的方法。 然後你可以使用普通功能的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(); 
    }
  2. 使用PowerMock(-ito)
    但PowerMockito改變CUT的字節碼,因此,你真的arn't測試您的CUT。我強烈建議不要使用它,除非您必須測試否則無法測試的遺留代碼。

+0

我明白,但有沒有辦法甚至做一些驗證如果doThis被稱爲? – vdk

+1

請告訴請求者,這首先是單元測試的錯誤方法。 –

1

如果你的方法返回void,那意味着它唯一可能做的工作就是產生副作用。那就是你真正想要測試的東西。

  1. 您設置外部狀態
  2. 您被測
  3. 運行的方法,您檢查狀態改變,你希望它改變。

爲測試中的方法內的每個執行路徑準備外部狀態,這將涵蓋代碼的所有可能結果。

+0

我明白,但有沒有辦法甚至做一些驗證如果doThis被稱爲? – vdk

+1

@visheshkamdar具體類實現不應該被測試,你想測試方法行爲(這個方法做什麼)而不是實現(這個方法是怎麼做的)。因爲實施可能會改變,您希望測試保持相關。 – SimY4

+0

我看着它錯了。感謝SimY4 – vdk