犀牛模拟:模拟与StrictMock对动态模拟

时间:2010-08-19 20:58:54

标签: tdd rhino-mocks mocking

我理解Mock和Stub之间的区别。

但RhinoMock框架中的不同类型的模拟混淆了我。

有人可以用RhinoMock框架来解释Mocks Vs StrictMocks和DynamicMocks的概念。

非常感谢您的回答。

2 个答案:

答案 0 :(得分:30)

严格模拟是一个模拟,如果你试图使用任何未明确设置使用的方法,它将抛出异常。

如果您尝试使用未设置的方法,动态(或松散)模拟不会抛出异常,它只会从方法返回 null 默认值并继续运行。

强烈建议使用动态模拟,因为严格的模拟通常会成为维护的噩梦。 Here's a good blog post具有严格与动态的代码示例,以及为什么严格的模拟通常是一个坏主意。

答案 1 :(得分:-3)

在这一点上非常不同意。

使用动态模拟无法进行测试驱动开发,因为您正在测试的不一定是您正在实施的内容。

想象一下,你添加了一个foreach循环,你在循环中进行了一个db调用。这非常严重。如果您使用动态模拟来模拟依赖项,则可能会错过模拟db调用,因此错过了可伸缩性问题,因为您不需要严格模拟每个数据库调用。

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

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

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