
写 Go 测试时,你是不是经常想:
“要是数据库层能假装返回固定结果,我就不用真连 MySQL 了!”
“要是 HTTP 客户端能演一出‘服务器 500 错’,我就能测重试逻辑了!”
——PegoMock 就是帮你找“演员”的导演,让接口说演啥就演啥。
它到底是啥?• 纯 Go 写的 mock 框架,专盯 interface。
• 一句话生成“替身”:原接口怎么定义,它就怎么“翻版”,还能录预期台词(stub)。
• 测试跑完自动验戏:哪句对白没喊、喊错顺序,它立刻红字报错。
一分钟体验1. 先安装
go install github.com/petergtz/pegomock/pegomock@latest
2. 对接口生成 mock
pegomock generate io.Reader
目录里马上蹦出 mock_io/mock_reader.go,实现一模一样的方法签名。
3. 写测试——像导演一样“讲戏”:
mockReader := mock_io.NewMockReader(ctrl)
// 预期:当有人 Read 时,返回 42 字节、nil 错误
pegomock.When(mockReader.Read(Any[[]byte]())).ThenReturn(42, nil)
4. 把 mock 传给你的业务代码,跑测试。
如果 Read 没被调到、或者参数不对,PegoMock 立刻掀桌报错,比老板还严格。
核心卖点• 与 gomock 语法兼容——老项目切过来零成本。
• 支持任意 interface,不用给代码打侵入式标记。
• 自动生成代码,一次生成,多人复用,提交仓库即可。
• 断言失败信息超详细:哪次调用、期望啥、实际啥,一目了然,再也不用盯着空白屏幕猜。
高级玩法• 顺序调用:InOrder() 保证 A 必须在 B 之前。
• 多次不同返回值:第一次返回错误,第二次重试成功,轻松模拟抖动网络。
• 参数匹配器:AnyInt(), Eq("abc"), 甚至自定义 Matcher 函数,想多细就多细。
• 并发安全:mock 内部带锁,并行测试一起跑也稳。
与“同行”比一比• testify/mock:需手写 mock 结构,接口一多就崩溃。
• gomock:官方出品,但断言语法啰嗦,失败信息像天书。
• PegoMock:兼容 gomock 的同时,自动生成 + 清晰错误 + 灵活 stub,一条龙到位。
真实小剧场场景:支付网关接口 PaymentService
需求:测“余额不足重试 3 次后失败”逻辑
代码 5 行搞定:
pegomock.When(payMock.Charge(100)).ThenReturn(ErrInsufficient).Times(3)
pegomock.When(payMock.Charge(100)).ThenReturn(ErrFinal)
跑测试——重试、失败、断言一次过,再也不用折腾本地沙箱账户。
总结PegoMock = 五分钟给接口找好“替身演员”
谁该说话、说啥、说几遍,全听你指挥。
写 Go 单元测试,不再被外部依赖卡脖子,让 mock 比真货还好用!