Mock是什么
Mock
是单元测试中常见的一种技术,就是在测试过程中,对于一些不容易构造或者获取的对象,创建一个Mock对象
来模拟对象的行为,从而把测试与测试边界以外的对象隔离开。- 优点:
- 团队并行工作
- 测试驱动开发 TDD (Test-Driven Development)
- 测试覆盖率
- 隔离系统
- 缺点
- Mock不是万能的,使用Mock也存在着风险,需要根据项目实际情况和具体需要来确定是否选用Mock。
- 测试过程中如果大量使用Mock,mock测试的场景失去了真实性,可能会导致在后续的系统性测试时才发现bug,使得缺陷发现的较晚,可能会造成后续修复成本更大
- Golang拥有mock第三方库,包含
gomock
包和mockgen
工具。
安装
go get github.com/golang/mock/gomock
go get github.com/golang/mock/mockgen
go install github.com/golang/mock/mockgen@v1.6.0
- 安装完成之后,执行
mockgen
看命令是否生效 - 如果显示命令无效,查看
GOPATH/bin
目录下是否有mockgen
二进制文件。如果命令无效但是`GOPATH 路径下的 bin 文件夹中存在 mockgen,请将 GOPATH 下 bin 文件夹的绝对路径添加到全局 PATH 中
生成Mock文件
- 使用
mockgen
工具 - 两种模式:
- 使用案例:
- 创建
test.go
文件,package test
- 定义一个接口
type MyInter interface {
GetName(id int) string
}
- 定义一个函数
func GetUser(m MyInter, id int) string {
user := m.GetName(id)
return user
}
- 此时要对
GetUser
测试,就要对接口进行实现,此时可以使用mock
mockgen -source test.go -destination mock_test.go -package test
mock
自动生成文件mock_test.go
,内容不用动- 创建
test_test.go
文件,写测试代码func TestGetUser(t *testing.T) {
mockCtl := gomock.NewController(t)
mockMyInter := NewMockMyInter(mockCtl)
mockMyInter.EXPECT().GetName(1).Return("NNNAMEEEEE")
v := GetUser(mockMyInter, 1)
if v == "NNNAMEEEEE" {
t.Log("right")
} else {
t.Error("error")
}
}
- 检查结果
