2010-08-19 115 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

相关问题