Mockery v3 用法介绍

14 阅读2分钟

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)