别再交 build_runner 税:我为什么在现代 Dart 里拒绝 Mockito
来源:dev.to — 2026-09-20
📋 概述
场景很常见:你正在做 TDD,红绿重构、手指飞快,然后给 UserRepository 接口加了一个新方法,切回测试文件准备打桩,一切戛然而止——生成出来的 mock 还不知道这个方法,IDE 满屏红波浪线。于是你叹口气,跑起那串咒语,等 15 秒、30 秒,在大型 Flutter 代码库里可能是整整两分钟,风扇转起来,思路断了。作者的质问是:为了给单元测试造一个 mock 对象,凭什么要跑重量级的编译期代码生成?他认为应该在现代 Dart 里停用 mockito,转向 mocktail。
🔑 核心要点
- 历史成因:空安全之前 mockito 靠 noSuchMethod 的运行时动态调用零代码生成就能工作,Dart 2.12 的可空安全打破了这套魔法。
- 因为无法返回 null 去满足非空返回类型,mockito 只能走编译期代码生成这条路,代价就是所谓的 build_runner 税。
- 第一宗罪是迭代税:TDD 依赖毫秒级反馈循环,每次接口变更都要跑代码生成,会把反馈拉长到几十秒。
- 开发者因此不再频繁跑测试,开始批量改动、不验证就提交,把跑测试当成事后补的事情,速度随之崩掉。
- 第二宗罪是 git diff 污染:每个含 mock 的测试文件都会生成几千行的 .mocks.dart 样板文件,直接带来合并冲突地狱。
💡 金句
凭什么为了给单元测试造一个 mock 对象,要跑重量级的编译期代码生成?
👍 0
👎 0
← 返回 dev.to 首页