为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2019-08-28 16:13:56
模拟和存根之间有什么区别?我已经阅读过各种关于模拟和测试中存根的文章,包括Martin Fowler的Mocks Are Not Stubs,但仍然不明白其中的区别。
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

前言

对象有几种定义,不是真实的。一般术语是测试双倍。这个术语包括:虚拟存根模拟

参考

根据Martin Fowler的文章

  • 虚拟对象传递但从未实际使用过。通常它们仅用于填充参数列表。

  • 对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子)。

  • 存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应。存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息。

  • 模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范。

样式

Mocks vs Stubs =行为测试与状态测试

原理

根据每次测试只测试一件事的原则,在一次测试中可能有几个存根,但通常只有一个模拟。

生命周期

使用存根测试生命周期:

  1. 设置 - 准备正在测试的对象及其存根协作者。

  2. 练习 - 测试功能。

  3. 验证状态 - 使用断言检查对象的状态。

  4. 拆解 - 清理资源。

使用模拟测试生命周期:

  1. 设置数据 - 准备正在测试的对象。

  2. 设置期望 - 准备主要对象正在使用的模拟期望。

  3. 练习 - 测试功能。

  4. 验证期望 - 验证是否已在mock中调用了正确的方法。

  5. 验证状态 - 使用断言检查对象的状态。

  6. 拆解 - 清理资源。

摘要

模拟和存根测试都给出了问题的答案:结果是什么?

使用模拟测试也对以下方面感兴趣:结果如何实现?


查看完整回答
反对 回复 2019-08-28
?
隔江千里

TA贡献1906条经验 获得超10个赞

以下是对每个示例的描述,然后是真实世界的示例。

  • 虚拟 - 只是虚假的价值来满足API

    示例:如果您正在测试一个类的方法,该类在构造函数中需要许多强制参数而对测试没有影响,那么您可以创建虚拟对象以创建类的新实例。

  •  - 创建一个可能依赖于某些外部基础结构的类的测试实现。(这是很好的做法,你的单元测试也不要实际上外部基础设施交互。)

    示例:创建用于访问数据库的虚假实现,将其替换为in-memory集合。

  • 存根 - 覆盖返回硬编码值的方法,也称为state-based

    示例:您的测试类取决于Calculate()需要5分钟才能完成的方法。您可以使用返回硬编码值的存根替换其实际实现,而不是等待5分钟; 只占一小部分时间。

  • 模拟 - 非常相似Stubinteraction-based不是基于状态。这意味着您不希望Mock返回某个值,而是假设方法调用的特定顺序。

    示例:您正在测试用户注册类。打电话后Save,应该打电话SendConfirmationEmail

Stubs并且Mocks实际上是子类型Mock,包括交换实际实现和测试实现,但出于不同的,特定的原因。


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 587 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信