2010-08-19 113 views

回答

28

嚴格的模擬是一個模擬,如果您嘗試使用任何未明確設置的方法來使用,它將引發異常。

如果嘗試使用未設置的方法,動態(或鬆散)模擬不會拋出異常,它將簡單地從方法返回缺省值 null 並繼續。

強烈建議使用動態模擬,因爲嚴格的模擬通常會成爲維護的噩夢。 Here's a good blog post,它有一個嚴格與動態的代碼示例,以及爲什麼嚴格的模仿通常是一個壞主意。

+1

吹毛求疵 - >「返回null」應該是這樣的 – 2010-08-19 21:05:52

+0

@Merlyn摩根 - 格雷厄姆「返回類型返回默認值」 - 偉大的一點:) – womp 2010-08-19 21:17:52

+0

@Merlyn摩根 - 格雷厄姆:非常感謝傢伙爲閃電般的快速反應。非常感激。 – 2010-08-19 21:22:54

-2

非常不贊同這一點。

可靠的測試驅動開發是不可能的使用動態模擬,因爲你正在測試不一定是你正在實施。

想象一下,你添加了一個foreach循環,你在循環內部做了一個db調用。這非常嚴重。如果您使用動態模擬來模擬您的依賴關係,您可能會錯過嘲笑數據庫調用,因此錯過了可伸縮性問題,因爲您不需要嚴格模擬每個數據庫調用。

public void myMethod() 
{ 
    externalMethod1.doSomething(); 
    foreach() 
    { 
     externalDbCall.doSql(); 
    } 
} 

public void testMyMethodWithDynamicMocksPassesAndMissesDbCallInLoop() 
{ 
    expect(externalMethod1.doSomething(); 
} 

public void testMyMethodWithStrictMocksFailsAndHighlightsDbCallInLoop() 
{ 
    expect(externalMethod1.doSomething(); 
} 
+8

你似乎不明白嘲笑的目的。當你嘲笑某事時,你明確地*不*測試那個特定的事情。如果你正在嘲笑DB代碼,那是因爲你沒有測試DB代碼。 – 2012-10-30 11:34:56

+4

如果你試圖回答這個問題,你的答案會更好。 – Gevious 2012-10-30 11:50:07

+1

@AndrewBarber我不同意格雷厄姆,但我認爲他的觀點是你應該關心*你怎麼稱呼嘲弄的對象,而不是模擬的東西。 – 2012-10-30 12:14:08

相關問題