mock和存根(JMock)之间的区别是什么?



jMock中mock和存根的区别是什么?我可以用jMock?我如何用它来创建存根,以及什么情况最适合这个,我相信使用存根是当我需要为测试准备一些状态时。

谢谢

Wikipedia有一篇关于Mock对象的文章,但是没有很好地解释术语。我们过去常常做这样的区分(当然,这可能需要讨论):

模拟和存根都模拟测试组件所需的对象。

当您想断言在被测试组件和被模拟对象之间发生某种特定类型的交互时,使用"mock"这个词。这就是为什么模拟框架(如EasyMock)提供方法来断言所有预期的调用都已实际执行。例如,您希望看到您的服务实际上调用了(模拟的)DAO。所以这个调用是测试条件/断言的一部分。

然而,当你只是试图提供一个帮助测试组件的实现时,就会使用"存根"这个词。发生什么样的交互并不重要,您只需要存根来填补空白,以便您可以测试您的组件。您的重点在于测试的组件及其功能。

这是两个词表示相同的东西,这取决于你想用它来达到什么目的。

Mocha是一个非常接近JMock模型的传统mock库。Stubba是Mocha的一个独立部分,它允许对真实(非模拟)类的方法进行模拟和存根。它的工作原理是将感兴趣的方法移到一边,添加方法的新存根版本,将其委托给传统的模拟对象。您可以使用这个模拟对象来设置存根的返回值或设置要调用的方法的期望。测试完成后,方法的存根版本被删除,并被原始版本所取代。

查看更多细节,示例

http://jamesmead.org/blog/2006-09-11-the-difference-between-mocks-and-stubs

我们通常会区分查询和操作。查询不会改变模拟对象之外的世界的状态——我们可以调用它一次或5次。如果你采用契约式设计,它们就像是先决条件。

动作改变外部世界(例如减去一个值),我们为这些动作指定模拟。调用mock的次数很重要,因为结果会有所不同。这些类似于后置条件。

Stub Queries, Mock Actions.

相关内容

最新更新