2009-10-05 61 views
14

我剛剛看了這個有趣的YouTube Video about unit testing(這是希特勒的假字幕咀嚼他的團隊沒有做好單元測試 - 跳過它,如果你幽默受損)存根受到徹底批評。但我不明白存根有什麼問題。單元測試的存根有什麼問題?

我還沒有開始使用模擬框架,我還沒有開始感覺到不使用它的痛苦。

某個時候我是在一個世界的傷害向下行,having chosen handwritten stubs and fakes instead of mocks (like Rhinomock etc)?(使用Fowler的分類法)

什麼是模擬效果和手寫存根之間採摘的考慮?

+1

你欠自己使用模擬框架(我使用犀牛)。他們會做很多事情來使你的TDD生活更輕鬆。 – mxmissile 2009-10-06 00:41:44

回答

11

存根沒有問題,有存根,嘲諷和間諜的空間。所有是「測試雙打」,但具有不同的目的,如Mocks and Stubs aren't Spies中所述:

[...]在繼續之前,我想 澄清並定義一些使用中的術語 這裏,我最初在 Gerard Meszaros的xUnit Patterns book中發現。

  • 虛擬對象是一個傳遞給被測系統 但從未使用的佔位符對象。
  • 甲測試存根提供系統與測試下間接輸入
  • 的檢驗間諜提供了一種方法,以驗證測試中的系統執行 正確間接輸出
  • 一個模擬對象提供被測系統與兩個間接輸入 和方法來驗證間接輸出

[...]你可以讓這個方便的圖表 指導你的決定:

alt text http://www.hamletdarcy.com/files/2007/MocksAreNotSpies.jpg

PS:Mockito - The New Mock Framework on the Block也值得一讀。

+0

+1。 – TrueWill 2009-10-06 01:00:35

+1

+0.5爲圖表,+0.5爲鏈接 – guerda 2009-10-06 06:21:36

+1

-1爲圖表,這基本上是錯誤的。嘲笑可能在斷言時失敗,它們可以更容易維護,並且更容易使用。我認爲該圖表可能已經過時,或者針對舊的嘲笑框架或舊版Java語言/框架中的框架。 (不是真的投票-1,但該圖表很糟糕) – 2009-10-06 22:29:19

5

嘲笑更容易投入。它們是您的課堂的一個真實實例,它具有以最小化樣板重寫任何方法的操作的功能。

有很多很少的考慮因素,例如:如果你不想處理任何方法,你可以讓它作爲一個空操作或不通過測試 - 你的選擇 - 但是方式幾乎沒有代碼。

當您將課程存根時,您會得到多少樣板文件?如果你的課程是最終的,你如何處理它?你是否玩技巧首先在類路徑上獲取你的存根,或者你使用不同的源?

我建議剛開始使用模擬遊戲 - 它更容易。

0

模擬和存根用於實現真正的單元測試。你只是嘲笑所有的依賴關係,並單獨測試你的類。

我目前正在使用MOQ進行嘲弄和剪枝。

3

使用存根而不是嘲笑沒有任何問題。

如果你想獲得技術,嘲笑是「聰明」的對象與期望可以驗證。存根是返回預設值的虛擬對象。請參閱Mocks Aren't Stubs

但很多人(包括我自己)都喜歡使用存根進行狀態測試,而不是使用模擬進行行爲測試。你在被測試的類中注入一個存根,你調用一個方法,然後你檢查被測試的類的狀態。它傾向於做出比脆弱的測試,而不是聲稱該類的內部被稱爲模擬對象的方法X,其參數爲Y.

我不認爲你是爲了一個受傷的世界。如果你還沒有開始感受到痛苦,那麼你可能不需要隔離/嘲諷框架。如果你這樣做,手寫的存根/假貨周圍不會傷害任何東西。

如果你有很多接口,或者如果你的接口有很多方法,隔離/模擬框架可以節省大量的手工編碼存根。

我喜歡Moq很多;我發現使用比Rhino Mocks創建存根更容易。

8

我用下面的術語(羅伊Osherove,單元測試的藝術的作者介紹):

一個是,如果你告訴它的假東西的情況下,一種叫做存根方法用這樣和那樣的參數來調用。但是,如果您還確認此類通話實際發生或發生了N次,則此類假冒稱爲模擬。簡而言之。假的是一個存根,除非你調用Verify(),然後它是一個模擬。

顯然,您需要在某些情況下使用存根,在其他情況下使用存根。因此,徹底批評存根可能是錯誤的,並且完全使用存根也可能是錯誤的。

如果您還沒有開始使用模擬框架(替代術語:隔離框架),您應該留意它們並經常重新評估您的選項。我很快從手動模擬到NMock2到Moq。這裏有一個有趣的程序員poll,顯示他們使用什麼。手動嘲諷/存根是少數,但並不罕見。

+1

單元測試藝術(好書)和Moq(好工具)+1。 – TrueWill 2009-10-08 17:13:29