模拟和存根之间有什么区别(JMock)

时间:2011-04-23 15:13:03

标签: java testing mocking stub jmock

jMock中的模拟和存根之间有什么区别?我可以用jMock创建两个?我如何用它创建存根以及最适合的情况,我相信使用存根是我需要准备一些状态进行测试。

由于

3 个答案:

答案 0 :(得分:2)

维基百科有一个article regarding Mock objects,但术语并没有被解释得那么好。我们曾经做过这种区分(当然可能需要讨论):

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

当您想要声明测试组件与模拟对象之间发生特定类型的交互时,使用“模拟”一词。这就是为什么模拟框架(如EasyMock)提供断言所有预期调用实际执行的方法。 E. g。你希望看到你的服务实际上是一个(模拟的)DAO。所以这个调用是测试条件/断言的一部分。

当您只是尝试提供有助于测试组件的实现时,会使用“存根”一词。进行什么样的交互并不重要,您只需要存根填补空白,以便您可以测试组件。您的重点在于经过测试的组件及其功能。

所以这只是同一件事的两个词,取决于你想用它实现的目标。

答案 1 :(得分:1)

Mocha是JMock模具中的传统模拟库。 Stubba是Mocha的一个独立部分,允许在真实(非模拟)类上模拟和存根方法。它的工作原理是将感兴趣的方法移到一边,添加一个新的存根版本的方法,该方法委托给传统的模拟对象。您可以使用此模拟对象来设置存根返回值或设置要调用的方法的期望。测试完成后,该方法的存根版本将被删除并替换为原始版本。

有关示例

的更多详细信息

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

答案 2 :(得分:0)

我们通常会区分查询和操作。查询不会改变模拟对象之外的世界状态 - 我们可以调用它一次或5次。如果您完成了按合同设计,它们就像是前提条件。

操作会改变外部世界(例如减去一个值),然后我们为这些操作指定模拟。重要的是我们称为模拟多少次因为结果会有所不同。这些就像后期条件。

Stub Queries,Mock Actions。