你能解释一下StrictMock和Partialmock之间的区别吗?

时间:2011-10-20 05:07:14

标签: c# .net unit-testing rhino-mocks

因为我正在使用RhinoMocks版本3.6,因为我没有使用Record-Replay,因为我没有调用Verify方法来对模拟进行断言;

你能解释一下非常简单的区别吗?

MockRepository.GenerateMock()
MockRepository.GeneratePartialMock()
MockRepository.GenerateStrictMock()

注意:我一直使用.GenerateMock创建我的模拟,并通过提供参数期望来断言方法调用。

2 个答案:

答案 0 :(得分:18)

差异为explained in this article

如果你对StrictMock没有期望,并且在模拟上调用了一个方法,则会抛出异常。

如果你对PartialMock没有任何期望,并且在模拟上调用了一个方法,则不会发生任何特殊情况。如果该模拟派生自基类,则调用将渗透到现有的基本实现。

还有一种叫做DynamicMock的东西。如果你对DynamicMock没有期望,并且在mock上调用了一个方法,则调用一个stub方法。如果有返回值,则会返回默认值(例如null0)。

GenerateMock我相信会创建DynamicMock

Ayende选择此默认设置是因为他建议仅使用DynamicMockStubStrictMock会产生脆弱的测试,并且通常违反了每次测试只验证一种行为的概念。

请参阅此文章:http://ayende.com/wiki/Rhino%20Mocks%203.5.ashx#CreateMockisdeprecated,replacedbyStrictMockTheuseofStrictMockisdiscouraged

我也看到他说从严格的模拟开始是有用的,一旦你对你的测试代码的行为感到满意,就可以将你的测试恢复到动态模拟/存根。没有链接的那个:)

答案 1 :(得分:0)

我必须补充一点,“用Ayende的话来阻止使用Strict Mock”。 http://ayende.com/wiki/Rhino+Mocks+3.5.ashx#CreateMockisdeprecated,replacedbyStrictMockTheuseofStrictMockisdiscouraged

他说:

  

如果不期望的事情发生,严格的模拟将失败   给他们。从长远来看,这意味着对代码的任何更改   即使更改与测试无关,测试也可能会破坏您的测试   你在这个特定的测试中实际测试的是什么。

     

我鼓励使用存根和动态模拟。