【发布时间】:2011-04-23 15:13:02
【问题描述】:
jMock 中的模拟和存根有什么区别?我可以用 jMock 创建两者吗?我如何用它创建存根以及最适合这种情况的情况,我相信使用存根是我需要为测试准备一些状态的时候。
谢谢
【问题讨论】:
标签: java testing mocking stub jmock
jMock 中的模拟和存根有什么区别?我可以用 jMock 创建两者吗?我如何用它创建存根以及最适合这种情况的情况,我相信使用存根是我需要为测试准备一些状态的时候。
谢谢
【问题讨论】:
标签: java testing mocking stub jmock
维基百科有一个article regarding Mock objects,但对术语的解释并没有尽善尽美。我们曾经做过这种区分(当然,这可能需要讨论):
模拟和存根都模拟测试组件所需的对象。
当您想要断言测试组件和模拟对象之间发生了特定类型的交互时,使用“模拟”一词。这就是为什么模拟框架(如 EasyMock)提供了断言所有预期调用都已实际执行的方法。例如。你想看到你的服务实际上调用了一个(模拟的)DAO。所以这个调用是你的测试条件/断言的一部分。
然而,当您只是试图提供一个有助于测试您的组件的实现时,就会使用“存根”这个词。发生什么样的交互并不重要,您只希望存根填补空白,以便您可以测试您的组件。您的重点在于测试的组件及其作用。
所以这只是同一件事的两个词,这取决于你想用它来实现什么。
【讨论】:
Mocha 是一个非常符合 JMock 模式的传统模拟库。 Stubba 是 Mocha 的一个独立部分,它允许在真实(非模拟)类上模拟和存根方法。它通过将感兴趣的方法移到一侧来工作,添加一个新的方法的存根版本,该版本委托给传统的模拟对象。您可以使用此模拟对象来设置存根返回值或设置要调用的方法的期望。测试完成后,方法的存根版本将被删除并替换为原始版本。
通过示例了解更多详情
http://jamesmead.org/blog/2006-09-11-the-difference-between-mocks-and-stubs
【讨论】:
我们通常会区分查询和操作。查询不会改变被模拟对象之外的世界状态——我们可以调用它一次或 5 次。如果您已经完成了按合同设计,它们就像前提条件。
动作改变外部世界(例如减去一个值),我们为它们指定模拟。我们调用模拟多少次很重要,因为结果会有所不同。这些类似于后置条件。
存根查询、模拟操作。
【讨论】: