猿问

模拟和存根之间有什么区别?

模拟和存根之间有什么区别?

我已经阅读过各种关于模拟和测试中存根的文章,包括Martin Fowler的Mocks Are Not Stubs,但仍然不明白其中的区别。



largeQ
浏览 629回答 3
3回答

守候你守候我

前言对象有几种定义,不是真实的。一般术语是测试双倍。这个术语包括:虚拟,假,存根,模拟。参考根据Martin Fowler的文章:虚拟对象传递但从未实际使用过。通常它们仅用于填充参数列表。假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子)。存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应。存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息。模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范。样式Mocks vs Stubs =行为测试与状态测试原理根据每次测试只测试一件事的原则,在一次测试中可能有几个存根,但通常只有一个模拟。生命周期使用存根测试生命周期:设置 - 准备正在测试的对象及其存根协作者。练习 - 测试功能。验证状态 - 使用断言检查对象的状态。拆解 - 清理资源。使用模拟测试生命周期:设置数据 - 准备正在测试的对象。设置期望 - 准备主要对象正在使用的模拟期望。练习 - 测试功能。验证期望 - 验证是否已在mock中调用了正确的方法。验证状态 - 使用断言检查对象的状态。拆解 - 清理资源。摘要模拟和存根测试都给出了问题的答案:结果是什么?使用模拟测试也对以下方面感兴趣:结果如何实现?

隔江千里

以下是对每个示例的描述,然后是真实世界的示例。虚拟 - 只是虚假的价值来满足API。示例:如果您正在测试一个类的方法,该类在构造函数中需要许多强制参数而对测试没有影响,那么您可以创建虚拟对象以创建类的新实例。假 - 创建一个可能依赖于某些外部基础结构的类的测试实现。(这是很好的做法,你的单元测试也不要实际上外部基础设施交互。)示例:创建用于访问数据库的虚假实现,将其替换为in-memory集合。存根 - 覆盖返回硬编码值的方法,也称为state-based。示例:您的测试类取决于Calculate()需要5分钟才能完成的方法。您可以使用返回硬编码值的存根替换其实际实现,而不是等待5分钟; 只占一小部分时间。模拟 - 非常相似Stub但interaction-based不是基于状态。这意味着您不希望Mock返回某个值,而是假设方法调用的特定顺序。示例:您正在测试用户注册类。打电话后Save,应该打电话SendConfirmationEmail。Stubs并且Mocks实际上是子类型Mock,包括交换实际实现和测试实现,但出于不同的,特定的原因。
随时随地看视频慕课网APP
我要回答