Mockery v3 是 Go 语言生态下主流的接口 Mock 生成工具,专为单元测试设计,核心作用是自动生成接口的 Mock 实现,帮助开发者隔离外部依赖(如数据库、第三方接口等),聚焦业务逻辑测试,大幅降低单元测试编写成本,适配 Go 面向接口编程的开发规范。
1. 核心功能
-
接口 Mock 自动生成 支持扫描包内公开顶层接口,一键生成可直接使用的 Mock 代码,无需手动编写样板代码。
-
灵活配置与调用 支持 YAML 配置文件(推荐)和命令行两种方式,可自定义输出目录、包名、命名格式等。
-
Testify 深度集成 生成的 Mock 代码原生兼容 testify/mock 库,支持 EXPECT 断言、调用次数验证等核心测试能力。
-
多场景适配 支持相对路径/模块全路径/绝对路径扫描,可适配单模块、多模块及测试文件内接口等场景。
2. 下载安装
下载对应版本二进制文件:github.com/vektra/mock…
// 解压
tar -zxvf mockery_3.6.3_Linux_x86_64.tar.gz
mv mockery /usr/bin/
3. 配置文件(.mockery.yml)
更多配置参数介绍参考: vektra.github.io/mockery/lat…
// 生成配置文件,目录参数参考go.mod的module路径
mockery init git-biz.abc.cn/stream/stream-service.git
// 指定配置文件执行命令生成代码
mockery --config .mockery.yml
all: false
dir: './mocks' # 存放mock文件的目录
filename: '{{.StructName}}.go' # 每个mock文件的文件名,此处使用下面的接口实现名称一致
force-file-write: true
formatter: goimports
generate: true
include-auto-generated: false
log-level: info
structname: '{{.Mock}}{{.InterfaceName}}' # 生成的Mock接口实现的名称
pkgname: mocks
recursive: false
require-template-schema-exists: true
template: testify
template-schema: '{{.Template}}.schema.json'
packages:
# 对应的包名,与go.mod中的module路径保持一致,接口所在路径为 pkg/gray/logic
git-biz.abc.cn/stream/stream-service.git/pkg/gray/logic:
config:
all: true
git-biz.abc.cn/stream/stream-service.git/pkg/gray/infrastructure/storage:
config:
all: true
指定接口不生成mock
在接口上方加上如下注释就可以使mockery生成mock代码时跳过该接口
//mockery:generate: false
type DB interface {
Get(key string) (string, error)
Put(key, value string) error
}
4. 命令
相对v2版本少了很多命令参数,包括--name 等
$ mockery -h
Generate mock objects for your Go interfaces
Usage:
mockery [flags]
mockery [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
init Generate a basic .mockery.yml file
migrate Migrate v2 config to v3.
showconfig Show the yaml config
version Print the version of mockery
Flags:
--config string config file to use
-h, --help help for mockery
--log-level string Level of logging
Use "mockery [command] --help" for more information about a command.
5. 使用
验证 Mock 方法的调用行为
生成的 Mock 代码支持验证方法调用次数、调用顺序、参数匹配,配合 testify/assert 让测试更严谨
// 1. 验证方法仅被调用1次
mockGL.EXPECT().Render(mock.Anything).Return("", nil).Once()
// 2. 验证方法被调用至少2次
mockGL.EXPECT().Parse(mock.Anything).Return(nil).MinTimes(2)
// 3. 匹配任意参数(无需精准匹配)
mockGL.EXPECT().Render(mock.Anything).Return("success", nil)
// 4. 匹配指定参数范围(使用testify断言)
mockGL.EXPECT().Get(mock.MatchedBy(func(key string) bool {return strings.HasPrefix(key, "user:")})).Return("alice", nil)