Mockey - 简单易用的 Go 语言模拟库
1. 项目介绍
Mockey 是一个简单易用的 Go 语言模拟库,它可以快速方便地模拟函数和变量。Mockey 在字节跳动的服务单元测试编写中被广泛使用(超过 7000 个存储库),并且得到了积极的维护。它通过在运行时重写函数指令,本质上类似于 gomonkey。
Mockey 使得替换函数、方法和变量变得简单,减少了需要将所有依赖项指定为接口的需求。
特性
-
基础功能
- 模拟函数和方法
- 支持基本类型和变体参数的函数
- 支持基本类型和变体参数的方法(值或指针接收器)
- 支持嵌套结构方法
- 固定值或动态模拟(通过自定义钩子函数)
- 导出私有类型的成员方法(不同包下)
- 条件模拟(通过自定义钩子函数)
-
高级功能
- 模拟后执行原始函数(装饰者模式)
- Goroutine 条件过滤(包含、排除、目标)
- 逐步更改模拟行为 - 支持序列
- 获取目标函数执行次数
- 获取模拟函数执行次数
- 模拟变量
- 支持常见和函数变量
2. 项目快速启动
在开始使用 Mockey 前,请确保你的环境中已经安装了 Go 1.13 或更高版本。
安装 Mockey
使用 go get 命令安装 Mockey:
go get github.com/bytedance/mockey@latest
示例代码
以下是一个使用 Mockey 的简单示例:
package main
import (
"fmt"
"testing"
"github.com/bytedance/mockey"
"github.com/smartystreets/goconvey/convey"
)
// 示例函数
func Foo(in string) string {
return in
}
// 示例结构体方法
type A struct{}
func (a A) Foo(in string) string {
return in
}
// 测试函数
func TestMockXXX(t *testing.T) {
// 函数模拟
convey.Convey("Function mocking", t, func() {
mockey.Mock(Foo).Return("c").Build()
// 断言函数被模拟
.So(Foo("anything"), convey.ShouldEqual, "c")
})
// 值接收器方法模拟
convey.Convey("Method mocking (value receiver)", t, func() {
mockey.Mock(A{}.Foo).Return("c").Build()
// 断言方法被模拟
.So(new(A).Foo("anything"), convey.ShouldEqual, "c")
})
// 指针接收器方法模拟
convey.Convey("Method mocking (pointer receiver)", t, func() {
mockey.Mock((*A).Foo).Return("c").Build()
// 断言方法被模拟
var b A
.So(b.Foo("anything"), convey.ShouldEqual, "c")
})
// 变量模拟
convey.Convey("Variable mocking", t, func() {
var Bar int
mockey.MockValue(&Bar).To(1)
// 断言变量被模拟
.So(Bar, convey.ShouldEqual, 1)
})
// 模拟结束后,自动释放
fmt.Println(Foo("a")) // 输出: a
fmt.Println(new(A).Foo("b")) // 输出: b
fmt.Println(Bar) // 输出: 0
})
3. 应用案例和最佳实践
(此处应根据实际使用场景提供具体的案例和最佳实践,例如如何在单元测试中模拟外部依赖,如何使用 Mockey 进行集成测试等。)
4. 典型生态项目
(这里可以列出一些使用 Mockey 的典型开源项目,以及它们是如何利用 Mockey 来提高项目的测试效率和代码质量的。)
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



