2016-11-14 55 views
1

我很努力地知道如何確定我的測試對象與什麼對象交互應該被嘲弄。我應該模擬我的測試對象與之交互的所有對象嗎?

class MyClass { 
    private Customer customer; 
    private Invoice invoice; 
    private PrintService ps; 
    private DBAccessService da; 
    private EmailService em; 
    .......... 
} 

我可以看到最後3個被嘲笑,因爲他們處理一些外部系統。客戶和發票怎麼樣?如果不是,爲什麼?

+0

一個測試策略是首先測試較低級別的對象/圖層,然後使用這些測試對象來測試較高級別的圖層。如果你覺得這樣比較好(根據你的設計和你的要求),那麼這對你來說可能是最好的策略。你不必嘲笑一切。 – markspace

+0

關於這個問題沒有完全的共識。這是說得很溫和,有關於它的激烈爭論。無論您選擇什麼路徑,都要記住自動測試的目的是:儘可能以最短的時間儘可能在最短的時間內找出錯誤。或者轉過來:建立對代碼正確性的信心。這就是關鍵所在。 – biziclop

回答

4

這個問題的一般答案是「我應該模擬我的測試對象與之交互的所有對象嗎?」是一個響亮的:這不是你應該內化或遵循的規則。嘲笑是多種測試類型中的一種,你必須對使用嘲笑的地方,使用其他贗品或測試雙打的地點以及使用真正的合作者的地點進行判斷。我同意你的決定,即最後三個字段(服務)可能值得嘲弄,如果它取決於我,我會使用前兩個字段(Customer和Invoice)的實際對象。

在這裏,我會堅持的指導方針,別拿數據對象,從幾個觀察其如下:

  • 數據對象往往是非常有狀態,並嘲諷框架往往存根狀態不好。 Mockito實際上沒有一個很好的語法「getX無限期返回15,直到您撥打setX(20),然後getX返回20」。因此,正確剔除通常很困難。

  • 對於只是字段/獲取者/設置者的數據對象,驗證無法通過讀取實際實現中的可變狀態來完成。誰在乎是否調用了getY,只要讀取對象中的值?誰在乎setY被調用了多少次,只要正確的值結束在對象中?因此,驗證通常是不必要的。

  • 數據對象通常寫在使用它們的對象之前,所以通常有一個已經存在的工作實現。數據對象往往具有決定性的行爲,而且幾乎沒有外部交互作用,所以在提高測試穩定性或減少測試脆弱性方面通常很少有什麼收穫。

作爲問題的評論中提到biziclop

永遠記住自動化測試的目的是什麼:找到在最短的時間錯誤,用盡可能小的努力。或者轉過來:建立對代碼正確性的信心。

從這個意義上講,嘲諷數據對象對測試的可讀性和正確性的成本很高,也不太可能提供有關測試正確性或穩定性的好處。我會避免它。

相關問題