2014-05-14 112 views
6

我的課有一個依賴,我在單元測試中嘲笑。我在一個對我沒有多大意義的地方得到了一個空引用異常。單元測試時,我應該嘲笑所有的依賴嗎?

我才意識到那是因爲我沒有設置我的嘲笑依賴。測試此依賴性,但它不連接到任何文件系統或數據源。

我只想在這個新班級中測試我的新代碼,但我想在這種情況下最好是而不是來嘲笑。

是這個結論是否正確?

回答

2

正確的。你應該嘲笑那些依賴於任何持久或外部的東西,以防止測試依賴任何持久或外部的東西。

如果依賴不依賴於持久化或外部的任何東西,那麼從嘲笑它的唯一好處是,即使依賴是錯誤的,測試也能正常工作 - 但假設模擬正常工作。爲此你需要:

  1. 寫一個模擬完全模擬依賴關係。

  2. 編寫的模擬將在測試中使用的特定情況下,相關性的模擬。

第一個選項是徹頭徹尾的荒謬 - 爲什麼你的模擬應該比原來的依賴更好?畢竟,可以肯定的是,假設在原始依賴項上投入了比在模擬中更多的努力......

第二個選項意味着你的模擬知道實現的確切細節 - 否則你將不知道如何實現使用依賴關係,所以你不知道如何模擬這些特定的用途。這意味着測試不會成爲單元測試的主要目的之一 - 驗證代碼在執行更改後能夠正常工作。

嘲諷的缺點是太大的優勢是太小了 - 尤其是考慮到,你總是可以運行依賴的測試,以檢查其是否正常工作......

+0

我恭敬地不同意。我認爲這有一個更好的答案: https://stackoverflow.com/questions/38181/when-should-i-mock – vpassapera

5

這聽起來像它的工作在你的情況,但通常情況並非如此,存根或模擬的唯一原因是從測試的頭髮中獲取外部數據源等。其他原因還包括

  • 的方法可能是緩慢的全部由自己
  • 可能難以拿出正確的參數傳遞給另一個類的方法來得到它的返回,你需要一個測試值您的方法
  • 您正在測試的方法需要另一個類的實例發生很大變化,並且當被調用者更改時不希望測試調用者中斷
  • 您依賴的方法很複雜足以需要它自己的測試,完全測試你的方法而不留下嘲諷或嘲弄意味着完全測試它所調用的方法(在你的方法本身的測試),並且這會導致重複類的測試,它調用
  • 你在外面做TDD方法測試之間,你還沒有寫被叫然而,僅僅設計了界面!
1

這取決於:你能否認爲依賴關係實際上只是一個私有的實現細節?如果是這樣,那麼嘲笑它只會讓你的測試更脆弱。

但是,如果它實際上是injected into your SUT的依賴關係,那麼它應該在您的單元測試中用一個測試double替換爲絕對

The SUT should be the only interesting thing in your test.爲了確保您的SUT在最佳條件下運行(對於正在測試的場景),一切應該是死記硬背,不斷變化的。

相關問題