2008-09-26 31 views
7

我開始習慣假貨,存根,嘲笑和動態模擬的想法。但是,在我理解何時使用部分模擬方面,我仍然有點不確定。何時使用部分模擬?

看起來,如果你打算嘲笑服務,並需要訴諸部分模擬,那麼這是一個糟糕的設計的標誌。部分模擬是否主要用於獲取測試覆蓋範圍內的遺留代碼?

另一方面,比如我正在測試一個具有Reset()方法的類。如果我已經在單獨的測試中確認了Reset()方法的工作原理,並且我有一些應該以對此方法的調用結束的類的某些功能,那麼對測試對象進行部分模擬並運行對部分模擬進行測試,在Reset()方法中定義期望值。

我目前有幾種測試方式是以這種方式建立的,這種事情是否會讓我陷入麻煩?

回答

1

我對部分模擬的理解是,它是嘲笑抽象類,只抽象抽象方法被嘲笑,現有的具體方法是保持原樣嗎?

2

它的好設計,恕我直言。當有人來到你身後並改變你的方法時,會發生什麼情況,取消重置呼叫? (順便說一句,爲什麼你的物體有這麼多的狀態?)你可能永遠不知道他們搞砸了,直到你生產。通過嘲諷它並在該方法調用上斷言,你可以確保沒有人會在維護你的代碼時搞砸了。

+0

請問,我不太明白你想說什麼。我在問什麼時候應該使用部分模擬而不是模擬工作。 – 2008-09-26 14:27:11

1

有人可能會爭辯說,所有的嘲笑都是「部分」的,因爲他們沒有完全實現一個接口。當你試圖測試一個非常有針對性的功能時,你應該只模擬支持這些類的方面,這些方面對於你正在測試的功能來說是必需的。

這將允許您的測試與其他測試分離,這很好。

2

在你的例子中,它聽起來像Reset方法是一個實現細節,並且通過使用部分模擬,你有可能將你的測試與類的實現耦合在一起。這會讓你的測試比需要的更脆弱。

我也認爲它使測試更混亂,有一個對象具有一些方法與真正的實現和一些存根實現。當你以後回來測試時,還需要記住一件事。

您可以(a)使用基於狀態的測試來聲明對象的狀態與您在內部調用真實Reset方法後的預期相同;或(b)使用基於交互的測試來驗證由於真正的Reset方法而導致對協作對象的相關調用?

您可能會發現從mockobjects.com Test Smell: Mocking concrete classes有用。