DC娱乐网

又一个低调好用的go mock库

写 Go 测试时,你是不是经常想:“要是数据库层能假装返回固定结果,我就不用真连 MySQL 了!”“要是 HTTP 客

写 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 比真货还好用!