3 回答
TA贡献1802条经验 获得超10个赞
前言
对象有几种定义,不是真实的。一般术语是测试双倍。这个术语包括:虚拟,假,存根,模拟。
参考
虚拟对象传递但从未实际使用过。通常它们仅用于填充参数列表。
假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子)。
存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应。存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息。
模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范。
样式
Mocks vs Stubs =行为测试与状态测试
原理
根据每次测试只测试一件事的原则,在一次测试中可能有几个存根,但通常只有一个模拟。
生命周期
使用存根测试生命周期:
设置 - 准备正在测试的对象及其存根协作者。
练习 - 测试功能。
验证状态 - 使用断言检查对象的状态。
拆解 - 清理资源。
使用模拟测试生命周期:
设置数据 - 准备正在测试的对象。
设置期望 - 准备主要对象正在使用的模拟期望。
练习 - 测试功能。
验证期望 - 验证是否已在mock中调用了正确的方法。
验证状态 - 使用断言检查对象的状态。
拆解 - 清理资源。
摘要
模拟和存根测试都给出了问题的答案:结果是什么?
使用模拟测试也对以下方面感兴趣:结果如何实现?
TA贡献1906条经验 获得超10个赞
以下是对每个示例的描述,然后是真实世界的示例。
虚拟 - 只是虚假的价值来满足
API
。示例:如果您正在测试一个类的方法,该类在构造函数中需要许多强制参数而对测试没有影响,那么您可以创建虚拟对象以创建类的新实例。
假 - 创建一个可能依赖于某些外部基础结构的类的测试实现。(这是很好的做法,你的单元测试也不要实际上外部基础设施交互。)
示例:创建用于访问数据库的虚假实现,将其替换为
in-memory
集合。存根 - 覆盖返回硬编码值的方法,也称为
state-based
。示例:您的测试类取决于
Calculate()
需要5分钟才能完成的方法。您可以使用返回硬编码值的存根替换其实际实现,而不是等待5分钟; 只占一小部分时间。模拟 - 非常相似
Stub
但interaction-based
不是基于状态。这意味着您不希望Mock
返回某个值,而是假设方法调用的特定顺序。示例:您正在测试用户注册类。打电话后
Save
,应该打电话SendConfirmationEmail
。
Stubs
并且Mocks
实际上是子类型Mock
,包括交换实际实现和测试实现,但出于不同的,特定的原因。
添加回答
举报