go单元测试利器: gomock使用

在 Go 语言中,使用  gomock  进行单元测试是一种常见的做法,特别是当你需要模拟外部依赖时。以下是如何使用  gomock  的基本步骤:
1. 安装  gomock  和  mockgen : 首先,你需要安装  gomock  库和  mockgen  工具,可以使用以下命令:
go get -u github.com/golang/mock/gomock
go install github.com/golang/mock/mockgen
2. 生成 Mock 代码: 使用  mockgen  工具为你的接口生成 mock 实现。例如,如果你的接口定义在  user.go  文件中,你可以使用以下命令来生成 mock 实现:
mockgen -source=user.go -destination=mock_user.go -package=yourpackage
这将生成一个  mock_user.go  文件,其中包含了你的接口的 mock 实现。
3. 编写测试代码: 在你的测试文件中,首先创建一个  gomock.Controller ,然后使用它来创建你的 mock 对象。例如:
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockObj := NewMockYourInterface(ctrl)
然后,你可以使用  EXPECT()  方法来设置你的 mock 对象的预期行为。例如:

mockObj.EXPECT().YourMethod(gomock.Any()).Return(expectedValue)
4. 运行测试: 使用  go test  命令运行你的测试。
5. 高级用法:
使用  gomock.Eq 、 gomock.Any  等匹配器来匹配参数。
使用  Times 、 MinTimes 、 MaxTimes  等方法来指定方法的调用次数。
使用  gomock.InOrder  来指定方法调用的顺序。
6. 注意事项:
 gomock  主要用于模拟接口,而不是具体实现。
使用  defer  来确保  ctrl.Finish()  被调用,以验证 mock 对象的预期行为。
更多详细信息和高级用法,可以参考官方文档或相关教程。

mock接口

// 生产者代理实现类, rpc实现或者无须权限校验的实现类

type IrpcCheckAllowed interface {
    // 测试开关、是否检查权限,方便测试可以关闭
    IfCheckRes() bool
    // 是否检查token
    IfCheckSession() bool
    // 根据token获取useid的实现
    RpcUserIdGetBySession(ctx *gin.Context, token string) (*webdto.WebUserId, error)

    // RPC 设置ctx上下文的CooUserID信息的实现
    RpcSetUserId(c *gin.Context) //set *webdto.WebUserId

    // RPC 获取ctx上下文的CooUserID信息的 实现
    RpcGetUserId(ctx *gin.Context) *webdto.WebUserId

    //rpc 检查权限的实现
    RpcCheckAllowed(ctx context.Context, req *webdto.WebCheckRequest) (*webdto.WebCheckResult, error)
}

mock实例

type MockcaseRpc struct {
    suite.Suite
 
    c       *gin.Context 
    t       gomock.TestReporter 
    mockObj *MockIrpcCheckAllowed
}

func NewMockcaseRpc() *MockcaseRpc {
    var m= &MockcaseRpc{}
    m.Init()
    return m
}

 
func (suite *MockcaseRpc) Init() {
    logrus.Info(" setup suite")

    ctrl := gomock.NewController(suite.t)
    defer ctrl.Finish()
    suite.mockObj = NewMockIrpcCheckAllowed(ctrl)
 
       suite.mockObj.EXPECT().IfCheckSession().Return(false)
       suite.mockObj.EXPECT().IfCheckRes().Return(false)

       // mockObj.EXPECT().RpcSetUserId(c)
       suite.mockObj.EXPECT().RpcUserIdGetBySession(suite.c, gomock.Any()).Return(webdto.TestWebUserId(), nil)
       var uid, err = suite.mockObj.RpcUserIdGetBySession(suite.c, "")
       golog.Info(uid, err)
 
       suite.mockObj.EXPECT().IfCheckSession().Return(false)
       suite.mockObj.EXPECT().IfCheckRes().Return(false)

       suite.mockObj.EXPECT().RpcCheckAllowed(suite.c, gomock.Any()).Return(webdto.DefaultPassedResult(), nil)
       // var webcheckRet, err = suite.mockObj.RpcCheckAllowed(suite.c, webdto.DefaultRequest())

}
 
 测试用例
func (suite *TestMockIrpcCheckAllowedSuite) Test008_IfCheckSession() {

    suite.mockObj.EXPECT().IfCheckSession().Return(false)
    suite.mockObj.EXPECT().IfCheckRes().Return(false)

    // mockObj.EXPECT().RpcSetUserId(c)
    suite.mockObj.EXPECT().RpcUserIdGetBySession(suite.c, gomock.Any()).Return(webdto.TestWebUserId(), nil)
    var uid, err = suite.mockObj.RpcUserIdGetBySession(suite.c, "")
    golog.Info(uid, err)
}
func (suite *TestMockIrpcCheckAllowedSuite) Test009_IfCheckAllowPassed() {

    suite.mockObj.EXPECT().IfCheckSession().Return(false)
    suite.mockObj.EXPECT().IfCheckRes().Return(false)

    suite.mockObj.EXPECT().RpcCheckAllowed(suite.c, gomock.Any()).Return(webdto.DefaultPassedResult(), nil)
    var webcheckRet, err = suite.mockObj.RpcCheckAllowed(suite.c, webdto.DefaultRequest())
    golog.Info(webcheckRet, err)
    //webcheck.FindBeanWebCheckRight().RegisterIrpc(suite.mockObj)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值