jMock 中的模拟和存根有什么区别?我可以用 jMock 创建两者吗?我如何用它创建存根以及最适合这种情况的情况,我相信使用存根是我需要为测试准备一些状态的时候。
谢谢
Wikipedia 有一篇关于 Mock objects的文章,但对术语的解释并没有尽善尽美。我们曾经做过这种区分(当然,这可能需要讨论):
模拟和存根都模拟测试组件所需的对象。
当您想要断言测试组件和模拟对象之间发生特定类型的交互时,使用“模拟”一词。这就是为什么模拟框架(如 EasyMock)提供了断言所有预期调用都已实际执行的方法。例如。您希望看到您的服务实际上调用了(模拟的)DAO。所以这个调用是你的测试条件/断言的一部分。
但是,当您只是尝试提供有助于测试组件的实现时,会使用“存根”一词。发生什么样的交互并不重要,您只希望存根填补空白,以便您可以测试您的组件。您的重点在于测试的组件及其功能。
所以这只是同一件事的两个词,这取决于你试图用它来实现什么。
Mocha is a traditional mocking library very much in the JMock mould. Stubba is a separate part of Mocha that allows mocking and stubbing of methods on real (non-mock) classes. It works by moving the method of interest to one side, adding a new stubbed version of the method which delegates to a traditional mock object. You can use this mock object to set up stubbed return values or set up expectations of methods to be called. After the test completes the stubbed version of the method is removed and replaced by the original.
for more detail with example
http://jamesmead.org/blog/2006-09-11-the-difference-between-mocks-and-stubs
我们通常会区分查询和操作。查询不会改变被模拟对象之外的世界状态——我们可以调用它一次或 5 次。如果您已经完成了按合同设计,它们就像前提条件。
动作改变外部世界(例如减去一个值),我们为它们指定模拟。我们调用模拟的次数很重要,因为结果会有所不同。这些就像后置条件。
存根查询,模拟操作。