我们真的需要隔离框架来创建存根吗?

时间:2010-05-22 19:59:26

标签: unit-testing rhino-mocks moq isolation-frameworks mocking

我读过这个:http://martinfowler.com/articles/mocksArentStubs.html 关于存根和模拟的概念很清楚。我理解像moq,rhinomocks等隔离框架的需要来创建一个模拟对象。作为嘲笑,参与实际的期望验证。但是为什么我们需要这些框架来创建存根。我更愿意推出一个手工创建的存根,并在各种灯具中使用它。

3 个答案:

答案 0 :(得分:4)

严格地说,不,你不需要需要隔离框架来创建存根。事实上,微软甚至有Stubs Framework 生成存根,而不是模拟。

我自己从未编写过一个隔离框架,但是一旦你有了对象模拟,就可以轻松创建存根。这可能是大多数/所有隔离框架都包含存根对象的主要原因。

关于你的最后一句话(“我宁愿推出一个手工创建的存根并在各种灯具中使用它”),你真的尝试过任何大型项目吗?当然,也许你有一个接口,只有一个方法返回一个可以为空的bool - 你只需要为该接口写三个存根,这并不是那么糟糕。

但是一旦你开始将数十个的接口和类看到存根,那么跟踪所有不同的存根就变得很乱。如果你在几个测试中使用每个存根,你当然可以证明手写存根并把它放在一边;但是当你只使用一个特定的存根一次或两次时,为了简单起见,将它保存为由框架直接生成的“匿名”存根要容易得多。

答案 1 :(得分:4)

在决定手动存根是更好的选择之前,您是否尝试使用像Rhino Mocks这样的库一两天?

@chibacity:关于模拟库的整个想法是避免实现。如果我只需要设置单个属性的值,我不想创建一个接口的整个实现。调用像

这样的代码
MyObj obj = MockRepository.GenerateStub<MyObj>();
obj.MyProperty = 33;

对我来说似乎更简单。更不用说我只需要一个哑存根作为参数传递的情况,我不关心它发生了什么(所以不需要设置)。

这并不意味着您不应该为更复杂的场景推出自己的存根,但根据我的经验,这种情况很少见。

我的建议是学习如何使用一个好的模拟库(如Rhino)及其所有的小技巧,我敢打赌,你很快就会学会理解它存在的原因。

答案 2 :(得分:2)

在使用模拟框架一段时间之后,我发现我的代码设计呈现出完全不同的倾向。这种倾向似乎更倾向于交互风格。换句话说,我对消息和行为比对状态更感兴趣。我的对象成为服务而不是使用存根时发生的有状态对象。对于存根,我最终将状态传递给其他对象。

然后我的问题变得更多的是创建抽象层。我不得不质疑某些东西应该在某个层面上进行交互。这有助于创造“最后负责任的时刻”。所以我最终得到了有生产者和消费者的对象。介于两者之间的只是消息渠道。

我希望这会有所帮助。