编写可测试代码:常见反模式及其修复方法

发布日期:2026-04-26 10:02:41   浏览量 :1
发布日期:2026-04-26 10:02:41  
1

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

当代码难以测试时,这通常是一个设计问题,而非测试问题。代码变得难以测试的原因,与其变得难以维护的原因相同。本文探讨了八种使代码更难测试的常见反模式,以及如何改进它们。虽然还存在其他反模式,但根据我编写和审查代码的经验,这些是最常见的。

请注意,这些反模式主要损害单元测试,因为单元测试的目标是隔离地测试业务逻辑片段。其他类型的测试,如集成测试和端到端测试,受到的影响可能较小,因为它们共同测试系统的较大部分。

本指南中的建议针对的是需要长期维护的生产环境代码库。将其应用于一次性脚本或临时原型则显得过于复杂且没有必要。

目录

  • 前提条件:本指南中使用的术语
  • 1. 硬编码依赖
  • 2. 隐藏的时间和随机性
  • 3. 全局可变状态
  • 4. 对产生副作用的代码进行静态调用
  • 5. 将业务逻辑与输入/输出(I/O)混合
  • 6. 捕获并吞没异常
  • 7. 被困在框架代码中的业务逻辑
  • 8. 隐藏在大型工作流中的业务逻辑
  • 何时无需注入依赖
  • 何时使用接口,何时不使用
  • 集成测试的定位
  • 可测试性检查清单
  • 结论

前提条件:本指南中使用的术语

  • 业务逻辑:业务逻辑或领域逻辑是指定义应用程序数据如何创建、存储、更改和使用的现实世界规则,独立于基础设施或用户界面细节。
  • 基础设施:与外部世界交互的代码,例如数据库、文件存储、外部应用程序编程接口(API)、消息队列和缓存。
  • 依赖:类或方法为了完成其工作所需要的东西。
  • 硬编码依赖:直接在代码内部创建的依赖,例如使用 new 关键字。
  • 依赖注入:将依赖传递给类或方法,而不是在代码中硬编码。
  • 模拟对象(Mock):一种测试对象,可以替换真实的依赖,返回预设的值,并验证是否发生了预期的调用。
  • 伪对象(Fake):一种简单的可用实现,用于在测试中替代真实的依赖,例如内存中的仓储实现。
  • 副作用:方法除了返回值之外所做的任何事情,例如保存数据、发送电子邮件、更改状态或发出超文本传输协议(HTTP)请求。
  • 确定性/非确定性代码:确定性代码对于相同的输入给出相同的输出;非确定性代码对于相同的输入可能给出不同的结果。

现在让我们来看看使代码更难测试的常见反模式,以及如何修复它们。

1. 硬编码依赖

class 订单服务 {
  public void 下单(订单 订单) {
    订单仓储 订单仓储实例 = new 订单仓储();
    支付网关 支付网关实例 = new 支付网

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部