2015-07-02 151 views
0

所以我嘗試測試方法methodUnderTest是這樣的:忽略參數

methodUnderTest{ 
    //Other stuff that works nice 
    this.setterMethod(OtherClass.methodThatErrors(arg1)); 
} 

所以我想,以避免靜態方法調用methodThatErrors

我在做什麼至今:

ClassUnderTest spy = Mockito.spy(objectOfClassUnderTest); 
Mockito.doNothing().when(spy).setterMethod(Mockito.any(OtherClass.class)); 

然而,這並不工作,方法仍然被調用。我會認爲它不應該調用參數方法,因爲我已經爲setterMethod的參數寫了any。那麼,如何使用Mockito而不是PowerMockito來阻止此通話。

編輯:

所以我設法通過移動靜態方法調用像這樣嘲笑它:

methodUnderTest{ 
    this.extraSetterMethod(arg1); 
} 

extraSetterMethod(arg1){ 
    this.setterMethod(OtherClass.methodThatErrors(arg1)); 
} 

我真的不喜歡這種解決方案,因爲它添加的代碼幾個額外的行(甚至更多與javadoc),這只是使類更混亂。

+0

是否有一個原因,你不想採取相反的方法,並從靜態類返回一個模擬,而不是嘲笑使用setter的行爲? – Makoto

+0

@Makoto我以爲你不能用mockito來嘲笑靜態類嗎? – Aequitas

+0

如果你使用PowerMockito,你可以。我的問題是你爲什麼從桌子上拿下這個選項。 – Makoto

回答

1

這裏的問題是,值來自靜態方法,直接直接,而不是設置本身。無論什麼價值都來自方法本身的真正調用。嘲笑對二傳手的呼叫沒有效果;這不是導致錯誤的結果。

這是你必須做出一個艱難的決定一個場景:

  • 介紹一個參數的方法,以便呼叫可以更容易嘲笑,或
  • 使用PowerMockito嘲笑了呼叫。

強烈鼓勵後者,特別是如果你正在處理遺留代碼庫這是不是很寬容的簽名更改。

+0

你能解釋爲什麼你不推薦前者?另外,我並不完全確定你的意思,它是否與我在使用其他方法編輯時指出的解決方案類似? – Aequitas

+0

一個傳統的代碼庫,有點混亂;沒有那麼多的測試和/或使用情況已經由一些僵化的審批過程規定,而僵化的審批過程是不靈活的改變。更大的問題是,貴公司禁止使用可以測試他們編寫的代碼類型的庫*更容易*,這令人難以置信。 – Makoto

+0

如果它不是傳統代碼呢?不過,我可以看到這一點,每次有人合併更改以確保它們沒有損壞任何東西時,都會運行這些測試的想法,PowerMockito會導致測試花費更長時間,這會導致大量浪費時間,即使是不會進行測試的人也是如此。這並不是說它被禁止,只是強烈不鼓勵,(重新)編寫可測試的代碼往往是更好的解決方案 – Aequitas