通常在做单元测试时,往往只能做本服务的测试,当需要调取别的服务(例如数据库、缓存等)时,这就需要mock工具来模拟数据替代真实调用来完成测试。 这里推荐第三方库为mockery: 项目地址: https://github.com/vektra/mockery
文档: https://vektra.github.io/mockery mockery提供了使用stretchr/testify/mock包为Golang接口轻松生成mock的能力。它删除了使用mock所需的样板编码。
安装mockery
go install github.com/vektra/mockery/v2@v2.42.2
注:不要使用@latest,因为这将从master上最新的、可能未标记的提交中提取。
下载testify
go get -u -v github.com/stretchr/testify
示例
1、新建目录example,新建文件db.go,内容如下:
package example
//go:generate mockery --name DB
type DB interface {
Get(val string) (string,error)
}
2、新建 example/db_getter.go
package example
func getFromDB(db DB) (string,error) {
return db.Get("ice cream")
}
3、在example目录下,执行
go generate
或
mockery --name DB
这个时候exmaple目录下生成了 example/mocks/DB.go。go generate 命令就是为了触发//go:generate mockery –name DB里面的mockery –name DB命令, 这样做的好处是go generate(需要了解这个命令点这里)可以批量处理多个目录多条指令。
4、新建测试文件example/db_getter_test.go
package example
import (
"demo/example/mocks"
"github.com/stretchr/testify/assert"
"testing"
)
func Test_getFromDB(t *testing.T) {
mockDB := mocks.NewDB(t)
mockDB.On("Get","ice cream").Return("chocolate",nil)
result,err:=getFromDB(mockDB)
//AssertExpectations 断言 On 和 Return 设置的参数和返回值的方法,有被调用
mockDB.AssertExpectations(t)
//校验返回错误码
assert.Nil(t, err)
//校验返回结果
assert.Equal(t,"chocolate",result)
}
用on方法时候,传入预制参数可以用mock.Anything,表示任意值都行。如
mockDB.On("Get",mock.Anything).Return("chocolate",nil)
5、验证测试
go test -run=Test_getFromDB -v
结果:
=== RUN Test_getFromDB
--- PASS: Test_getFromDB (0.00s)
PASS
ok demo/example 0.030s
总结
- mockery提供了一个更加用户友好的API,使用起来不那么混乱
- mockery利用了testify,这是一个健壮且功能丰富的测试框架
- mockery 有丰富的配置选项,允许对mock的生成方式进行细粒度控制
- mockery的CLI更加健壮、用户友好,并提供了更多选项
- mockery支持泛型(如果gomock支持泛型时,这可能不再是一个优势)
links
https://vektra.github.io/mockery
https://www.jb51.net/article/270098.htm
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/81501.html