测试替身: Mock、Spy、Stub

本文介绍了测试替身的概念,包括 Dummy、Fake、Stub、Spy 和 Mock 的区别。重点讨论了 Mockito 框架在单元测试中的应用,包括如何使用 mock、spy 方法,以及 verify 传入下游参数对象的方法。此外,还讲解了如何修改 mock 对象的行为,使用 spy 实现部分真实行为的模拟,并展示了使用注解简化测试代码的方法。最后提到了 reset mock 的功能,以保持测试的独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Test Double 简介

对于一个应用程序或者一个系统而言,很难给你一个纯粹的类进行单元测试。对象之间的依赖往往交织到一起,需要拆成各个单元才能逐个击破,也是单元测试的目的。

需要将这些交织到一起的对象拆开,需要一些工具,例如模拟一些数据、替换一些具有某些特定行为的类等。 网站 xunitpatterns.com 把这些工具称为 Test Double,翻译过来就是”测试替身“。

Martin Fowler 为了让这些概念更容易理解,在他的网站上重新更加具体的定义了它们:

  • Dummy 被用来仅仅作为填充参数列表的对象,实际上不会用到它们,对测试结果也没有任何影响。
  • Fake 一些假的对象或者组件,测试过程中会被用到。例如内存数据库 h2,假的用于用户鉴权的 Bean,一般只会在测试环境下起作用,不会应用于生产。
  • Stubs 为被测试对象提供数据,没有任何行为,往往是测试对象依赖关系的上游。
  • Spies 被依赖对象的代理,行为往往由被代理的真实对象提供,代理的目的是为了断言程序运行的正确性。
  • Mocks 模拟一个具有特性行为的对象,在测试开始
<think>嗯,用户想了解如何绘制关于软件测试替身的图表或思维导图,需要思路和方法。首先,我需要回忆软件测试替身的基本概念和分类,确保自己理解正确。测试替身主要包括Dummy、StubSpyMock、Fake等,对吧?这些类型各有不同的用途和特点,比如Dummy只是占位符,而Mock可以验证交互行为。 接下来,用户需要的是绘制图表或思维导图的步骤。可能需要先确定核心概念,然后分支展开。比如,中心节点是“软件测试替身”,然后分为类型、用途、区别、应用场景、工具支持等部分。每个类型下再详细说明定义和示例,这样结构清晰。 然后要考虑如何组织信息。可能需要比较不同替身的区别,比如MockStub的区别在于Mock会验证方法的调用,而Stub只是提供预设的响应。这部分用表格或对比图可能更直观。另外,应用场景方面,单元测试中常用MockStub,集成测试可能用Fake,这些也需要在图表中体现。 用户可能还希望知道实际绘制的工具,比如XMind、MindMaster或者在线工具如ProcessOn。是否需要推荐具体的工具呢?可能用户对工具不熟悉,提供几个选项会有帮助。另外,绘制方法上,可能需要分步骤:确定主题、分类整理、选择图表类型、绘制结构、添加示例和对比,最后美化调整。 还要注意引用相关的资料,比如测试方法中的黑盒和白盒测试,虽然测试替身更多属于单元测试的范畴,但可能和这些方法有关联。比如,测试替身常用于隔离被测组件,属于白盒测试的实现细节。不过用户提供的引用中提到黑盒和灰盒测试,可能需要适当关联。 另外,用户的问题是否涉及如何选择测试替身?比如在什么情况下用Mock而不是Stub,这也是图表中可以包含的内容。可能需要给出选择建议,比如根据是否需要验证交互来选择Mock,或者只需返回数据用Stub。 最后,检查是否有遗漏的部分,比如测试替身的优缺点,或者实际代码示例。虽然用户主要问的是图表绘制,但提供示例可能帮助理解,比如用代码片段说明MockStub的使用区别,这可以作为图表中的示例部分。 总结思路:确定图表结构,分类展示测试替身类型,对比区别,说明应用场景和工具,提供绘制步骤和工具推荐,并加入示例和选择建议。确保信息准确,结构清晰,符合用户需求。</think>### 软件测试替身图表绘制思路与方法 #### 一、核心内容梳理 1. **测试替身分类** - Dummy:占位符对象,无实际功能 - Stub:提供预设响应的简单实现 - Spy:记录调用信息的增强型Stub - Mock:预设预期并验证交互行为 - Fake:简化但可运行的业务逻辑实现[^1] 2. **关键维度对比** | 类型 | 用途 | 交互验证 | 实现复杂度 | 典型场景 | |--------|------------------------|----------|------------|------------------| | Dummy | 参数占位 | 否 | 低 | 依赖项占位 | | Stub | 返回预设数据 | 否 | 中 | 数据隔离 | | Spy | 记录调用过程 | 部分 | 中 | 调用追踪 | | Mock | 验证方法调用与参数 | 是 | 高 | 行为验证 | | Fake | 替代真实组件 | 否 | 高 | 数据库/服务替代 | #### 二、图表绘制步骤 1. **确定结构类型** - **树状图**:以测试替身为根节点,展开类型、特点、应用示例 - **对比矩阵**:横向维度为替身类型,纵向为功能属性 - **流程图**:展示替身选择逻辑(如根据测试目标选择类型) 2. **内容组织建议** ```mermaid graph TD A[测试替身] --> B[类型] A --> C[区别] A --> D[应用场景] B --> B1(Dummy) B --> B2(Stub) B --> B3(Spy) B --> B4(Mock) B --> B5(Fake) D --> D1(单元测试隔离) D --> D2(外部依赖模拟) D --> D3(行为验证) ``` 3. **工具选择** - **思维导图工具**:XMind/MindMaster(结构化展示) - **UML工具**:PlantUML/Draw.io(绘制类图与序列图) - **代码关联工具**:结合Minium框架示例展示替身实现[^2] #### 三、进阶绘制技巧 1. **添加代码映射** ```python # Mock示例(Python) from unittest.mock import Mock user_service = Mock() user_service.get_name.return_value = "TestUser" print(user_service.get_name()) # 输出 TestUser ``` 2. **标注选择逻辑** ```plaintext ┌──────────────┐ │ 需要验证交互? │──是─→ 使用Mock └──────┬───────┘ │否 ┌──────▼──────┐ │ 需要持久化? │──是─→ 使用Fake └──────┬──────┘ │否 ┌──────▼───────┐ │只需简单响应? │──是─→ 使用Stub └──────────────┘ ``` 3. **引用标准关联** 在测试策略标注中关联黑盒/白盒方法,例如Mock属于白盒测试技术[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值