# 1. Mock、Stub、Fake、Spy、Dummy 五种测试替身的本质区别和使用场景?请为每种替身举一个典型应用示例。 A Stub 提供预置数据用于驱动被测逻辑,但不验证交互 ✓ 正确答案 B Mock 只提供数据,不验证调用 C Dummy 会验证交互是否发生 D Spy 与 Mock 完全等价
# 2. Stub、Spy、Mock、Fake 四类测试替身在行为验证上的本质区别与误用场景? A Stub 主要用于行为验证 B Mock 典型用于行为验证(verify 交互),而 Stub 只供状态验证 ✓ 正确答案 C Spy 不记录任何调用 D Fake 用于记录调用并断言
# 3. Mock 过多导致的"实现耦合测试"如何识别与重构,如何以契约测试替代? A 实现耦合测试改动内部实现时不易失败 B 契约测试用共享契约替代测试内 mock,既解耦又防止替身与真实 API 漂移 ✓ 正确答案 C Mock 越多越好,能覆盖更多分支 D 契约测试只适用于单元测试
# 4. 服务虚拟化(Service Virtualization)在微服务测试中的价值,与 Mock/Stub 的关系和差异? A 服务虚拟化是代码级替身,与 Mock 等价 B 服务虚拟化是进程/网络级替身,模拟真实协议与故障,与代码级 Mock/Stub 互补 ✓ 正确答案 C 服务虚拟化只能用于单元测试 D 服务虚拟化不能模拟故障
# 5. WireMock/Hoverfly 在服务虚拟化中的典型模式,请求匹配策略(URL/Header/Body)、有状态场景模拟(Stateful Scenarios)和延迟注入的设计? A 请求匹配只能按 URL 匹配 B Scenario 机制可模拟有状态流程,延迟注入可模拟慢接口/故障 ✓ 正确答案 C WireMock 不支持 Header 匹配 D 延迟注入只能用于成功响应
# 6. 契约感知(Contract-Aware)的 Mock 生成,如何基于 OpenAPI/AsyncAPI 规范自动生成测试替身,确保 Mock 行为与真实服务一致? A 基于 OpenAPI/AsyncAPI 契约自动生成替身,可确保替身行为与真实服务一致 ✓ 正确答案 B 契约感知 Mock 与契约无关 C OpenAPI 只能描述异步事件 D 契约感知 Mock 无法校验请求
# 7. 事件驱动系统(Event-Driven Systems)中的测试替身,如何模拟消息队列(Kafka/RabbitMQ)的行为?事件顺序、重复投递和消费者组的测试策略? A 只需 Mock 队列客户端即可覆盖所有场景 B 事件顺序无需测试 C 需覆盖事件顺序、重复投递与消费者组语义,并用真实队列容器保证投递语义真实 ✓ 正确答案 D 消费者处理重复事件是允许的,无需幂等
# 8. 服务虚拟化(WireMock/Mountebank)与真实下游联调环境的取舍,虚拟化度如何度量? A 应"日常虚拟化 + 定期真实联调"互补,并用虚拟化度衡量覆盖决策 ✓ 正确答案 B 虚拟化越彻底越好,可完全替代真实联调 C 真实联调永远优于虚拟化 D 虚拟化度无需度量
# 9. AI 生成单元测试时,替身选择错误(如把真实依赖当 Mock)如何通过代码评审发现? A 把真实依赖当 Mock 使用可让测试更快更稳 B 评审时应检查测试是否触真实 IO、是否 verify 真实对象,并约束 AI 用 Fake/Stub ✓ 正确答案 C AI 生成的替身选择无需人工审查 D 单元测试应尽量访问真实数据库
# 10. Mockito/pytest-mock/Vitest 等框架中 when/stub 与 verify 的职责边界,何时断言交互、何时只 stub 返回值? A stub 用于断言交互,verify 用于返回数据 B 所有测试都应 verify 每个内部调用 C when 与 verify 可以随意互换 D 能状态验证就不行为验证,仅在协作本身是被测点时用 verify 断言交互 ✓ 正确答案
# 11. 测试替身的层级选择,对象级(Mock 对象)、进程级(WireMock/Mountebank)与容器级(Testcontainers)各自的适用场景? A 所有测试都应使用真实服务 B 单元测试用容器级替身最合适 C 层级越高越轻越快 D 对象级用于单元、容器级用于集成、进程级用于跨服务虚拟化,按测试目标选择 ✓ 正确答案
# 12. 测试替身与测试金字塔的配合,单元层用 Mock/Stub、集成层用 Testcontainers、端到端用真实服务,各层替身策略如何避免"重单元轻集成"? A 单元测试越多越好,集成测试可有可无 B 端到端测试应该最多 C 金字塔各层替身策略完全相同 D 用 Testcontainers/契约测试降低集成测试门槛,按金字塔分层配置替身,避免重单元轻集成 ✓ 正确答案
# 13. 替身与真实实现的漂移治理,替身行为与真实 API 不一致导致假绿,如何用契约测试(Pact)与定时真实联调对冲? A 替身永远不会漂移 B 用 Pact 契约测试固化契约一致性,并结合定时真实联调对冲真实行为漂移 ✓ 正确答案 C 假绿无需处理 D 契约测试只能用于单元测试
# 14. 测试替身框架的实现原理,Mockito 如何用字节码/动态代理生成替身,final 类与方法为何难 mock(inline mock maker)? A Mockito 只能 mock 接口 B Mockito 通过生成真实子类并重写方法,final 类无法被继承故需 inline mock maker 改写字节码 ✓ 正确答案 C final 类无需任何特殊处理即可 mock D Mockito 不能 mock 类
# 15. 为什么"为新需求写 Mock"经常是危险信号? A 新需求写 Mock 说明设计良好 B 新需求无法用真实对象测试 C Mock 越多,测试越好 D 可能反映耦合过重、边界不清,应优先用真实逻辑/Fake 驱动,仅在跨边界时再 Mock ✓ 正确答案
# 16. 过度 Mock 的反模式识别,哪些信号表明测试替身使用过度(如 Mock 链过长、Mock 与实现强耦合、测试通过但集成失败)?如何重构? A 识别信号如 Mock 链过长、与实现强耦合、假绿,重构应转状态验证并减少对内部细节的 mock ✓ 正确答案 B Mock 链越长测试越可靠 C 测试通过即说明替身无误 D 过度 Mock 无法重构
# 17. 测试替身在并发与性能测试中的适用边界是什么? A 性能测试应多用替身以提高性能 B 替身能反映真实并发语义 C 并发测试用替身即可覆盖所有问题 D 替身仅适用验证逻辑正确性,性能指标与真实资源语义必须用真实依赖 ✓ 正确答案
# 18. 测试替身带来的「假绿」问题,替身行为与真实实现漂移导致测试通过但生产失败,如何用契约测试与定期联调对冲? A 假绿无法避免 B 替身永远不会与真实实现不一致 C 契约测试能覆盖所有真实行为细节 D 假绿是替身行为与真实实现漂移导致,需用契约测试与定期真实联调对冲 ✓ 正确答案
# 19. 服务虚拟化的录制-回放模式,录制真实下游响应生成虚拟服务,如何保证录制数据的脱敏与时效性? A 录制数据可直接使用,无需脱敏 B 录制数据需脱敏保护敏感信息,并定期重新录制以保证时效性 ✓ 正确答案 C 录制数据永远不会过期 D 脱敏会破坏所有录制结构