我的課有一個依賴,我在單元測試中嘲笑。我在一個對我沒有多大意義的地方得到了一個空引用異常。單元測試時,我應該嘲笑所有的依賴嗎?
我才意識到那是因爲我沒有設置我的嘲笑依賴。測試此依賴性,但它不連接到任何文件系統或數據源。
我只想在這個新班級中測試我的新代碼,但我想在這種情況下最好是而不是來嘲笑。
是這個結論是否正確?
我的課有一個依賴,我在單元測試中嘲笑。我在一個對我沒有多大意義的地方得到了一個空引用異常。單元測試時,我應該嘲笑所有的依賴嗎?
我才意識到那是因爲我沒有設置我的嘲笑依賴。測試此依賴性,但它不連接到任何文件系統或數據源。
我只想在這個新班級中測試我的新代碼,但我想在這種情況下最好是而不是來嘲笑。
是這個結論是否正確?
正確的。你應該嘲笑那些依賴於任何持久或外部的東西,以防止測試依賴任何持久或外部的東西。
如果依賴不依賴於持久化或外部的任何東西,那麼從嘲笑它的唯一好處是,即使依賴是錯誤的,測試也能正常工作 - 但假設模擬正常工作。爲此你需要:
寫一個模擬完全模擬依賴關係。
編寫的模擬將在測試中使用的特定情況下,相關性的模擬。
第一個選項是徹頭徹尾的荒謬 - 爲什麼你的模擬應該比原來的依賴更好?畢竟,可以肯定的是,假設在原始依賴項上投入了比在模擬中更多的努力......
第二個選項意味着你的模擬知道實現的確切細節 - 否則你將不知道如何實現使用依賴關係,所以你不知道如何模擬這些特定的用途。這意味着測試不會成爲單元測試的主要目的之一 - 驗證代碼在執行更改後能夠正常工作。
嘲諷的缺點是太大的優勢是太小了 - 尤其是考慮到,你總是可以運行依賴的測試,以檢查其是否正常工作......
這聽起來像它的工作在你的情況,但通常情況並非如此,存根或模擬的唯一原因是從測試的頭髮中獲取外部數據源等。其他原因還包括
這取決於:你能否認爲依賴關係實際上只是一個私有的實現細節?如果是這樣,那麼嘲笑它只會讓你的測試更脆弱。
但是,如果它實際上是injected into your SUT的依賴關係,那麼它應該在您的單元測試中用一個測試double替換爲絕對。
The SUT should be the only interesting thing in your test.爲了確保您的SUT在最佳條件下運行(對於正在測試的場景),一切應該是死記硬背,不斷變化的。
我恭敬地不同意。我認爲這有一個更好的答案: https://stackoverflow.com/questions/38181/when-should-i-mock – vpassapera