4

我读过这个:http ://martinfowler.com/articles/mocksArentStubs.html 我对存根和模拟的概念很清楚。我理解像 moq、rhinomocks 这样的隔离框架的需求,并且喜欢创建一个模拟对象。作为模拟,参与对期望的实际验证。但是为什么我们需要这些框架来创建存根。我宁愿推出一个手工创建的存根并在各种固定装置中使用它。

4

3 回答 3

4

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

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

MyObj obj = MockRepository.GenerateStub<MyObj>();
obj.MyProperty = 33;

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

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

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

于 2010-05-23T14:15:58.747 回答
4

严格来说,不,您不需要隔离框架来创建存根。事实上,微软甚至有一个只生成存根而不是模拟的存根框架。

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

关于你的最后一句话(“我宁愿推出一个手工创建的存根并在各种固定装置中使用它”),你真的在​​任何大型项目中尝试过吗?当然,也许你有一个接口,它只有一个方法返回一个可以为空的布尔值——你只需要为那个接口编写三个存根,这还不错。

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

于 2010-05-23T02:34:07.490 回答
2

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

对我来说,问题就变成了创建抽象层。我不得不质疑某些东西应该在某些层面上相互作用。这有助于创造“最后负责任的时刻”。所以我最终得到了具有生产者和消费者的对象。两者之间的一切都只是消息渠道。

我希望这有帮助。

于 2010-05-25T19:11:48.240 回答