2015-09-22 30 views
0

有沒有辦法讓mockito中的模擬或間諜對象在方法競爭前返回其值?例如,如果我有這樣的使mockito強制方法在處理完成前返回其值

public class Calculator{ 

    public List calculate(List l){ 
     l.add(1); 
     l.add(2); 
     method1(l); 
     method2(l); 
     method3(l); 

     return l; 
    } 

    public void method1(List l){ 
     //calculate something here 
    } 

    public void method2(List l){ 
     //calculate something here 
    } 

    public void method3(List l){ 
     //calculate something here 
    } 
} 

級然後我用狙這樣

Calculator calculator = new Calculator(); 
Calculator spy = spy(calculator); 
when(spy.calculate(aList)).thenCallRealMethod(); 

我可以結束其過程中的方法稱爲方法2之後?我知道我可以使用doNothing().when(spy).method3(anyList())來避免method3被調用,但有什麼方法可以讓方法計算在方法2被調用後停止它的進程嗎?

+1

_Why_你想在單元測試中做到這一點?你可以添加更多的上下文,因爲這看起來像是[X-Y問題](http://mywiki.wooledge.org/XyProblem)? –

+0

,因爲我真正的方法是計算數據庫中多個實體的方法,一些較早的計算過程可以在不使用數據庫的情況下完成,但後面的過程需要更新或從數據庫中選擇。我希望我的代碼覆蓋在這個方法中,但作者是其他人,所以如果我可以保持現在的方法,同時仍然保持代碼覆蓋率。 – Angga

+1

而不是'method1'和'method2'在'List l'上產生_side effects_,你可以重構它們來返回計算結果嗎?這樣,你可以簡單地單獨測試這兩種方法。 –

回答

1

要直接回答問題:不,您不能使用Mockito完全避免方法調用,或者深度更改被測系統的行爲。

Mockito在內部創建了一個有問題的類的動態子類*。這正確暗示除非您覆蓋Calculator.calculate(擊敗測試calculate的真正實現的目的),否則您將無法使用Mockito來避免調用method3

你最好的選擇:如在評論中討論

  • 重構。
  • 按照您的建議使用doNothing().when(spiedCalculator).method3()
  • method2中拋出異常,避免調用method3,儘管這會阻止流在達到method3之後到達函數部分。

*的實現實際上是CGLIB或ByteBuddy做出了產生字節碼的代理類。

相關問題