Go mock工具mockery

通常在做单元测试时,往往只能做本服务的测试,当需要调取别的服务(例如数据库、缓存等)时,这就需要mock工具来模拟数据替代真实调用来完成测试。

通常在做单元测试时,往往只能做本服务的测试,当需要调取别的服务(例如数据库、缓存等)时,这就需要mock工具来模拟数据替代真实调用来完成测试。 这里推荐第三方库为mockery: 项目地址: https://github.com/vektra/mockery

文档: https://vektra.github.io/mockery mockery提供了使用stretchr/testify/mock包为Golang接口轻松生成mock的能力。它删除了使用mock所需的样板编码。

Go mock工具mockery

安装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

(0)
上一篇 2024-09-04 19:45
下一篇 2024-09-06 17:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信