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

Java 模拟和存根(JMock)之间有什么区别,java,testing,mocking,stub,jmock,Java,Testing,Mocking,Stub,Jmock,jMock中的mock和stub有什么区别?我可以用jMock创建这两个吗?如何使用它创建存根,以及什么情况最适合这种情况,我相信使用存根是在我需要为测试准备一些状态的时候 谢谢摩卡是一个传统的模仿库,非常适合JMock模式。Stubba是Mocha的一个独立部分,它允许在真实(非模拟)类上模拟和存根方法。它的工作原理是将感兴趣的方法移到一边,添加一个新的存根版本的方法,该方法将委托给传统的模拟对象。您可以使用此模拟对象设置存根返回值或设置要调用的方法的期望值。测试完成后,删除该方法的存根版本并

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


谢谢

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

有关更多详细信息,请参见示例

维基百科有一个很好的解释,但是这个术语解释得不够好。我们过去常常作出这种区分(当然,这可能会受到讨论):

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

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

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


因此,这只是一件事的两个词,这取决于您试图用它实现什么。

我们通常区分查询和操作。查询不会改变模拟对象外部世界的状态——我们可以调用它一次或五次。它们就像是合同设计的先决条件

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

存根查询、模拟操作