最佳体验请使用Chrome67及以上版本、火狐、Edge、Safari浏览器 ×

创建银行
创建开票

    go单元测试利器

    作者:雷建明@芯速配 阅读39 2024/09/29 06:56:22 文章 原创 公开

    在 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 对象的预期行为。

    更多详细信息和高级用法,可以参考官方文档或相关教程。


    测试接口

    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)
    }


    测试用例


    (*) () {
    
        ..().().()
        ..().().()
    
        ..().(..()).(.())
        = ..(.)
        .()
    }
    (*) () {
    
        ..().().()
        ..().().()
    
        ..().(..()).(.())
        = ..(..())
        .()
        .().(.)
    
    }


    声明:本网站部分内容来源于网络,版权归原权利人所有,其观点不代表本网站立场;本网站视频或图片制作权归当前商户及其作者,涉及未经授权的制作均须标记“样稿”。如内容侵犯了您相关权利,请及时通过邮箱service@ichub.com与我们联系。
     0  0

    微信扫一扫:分享

    微信里点“+”,扫一扫二维码

    便可将本文分享至朋友圈。

      
    
    
    分享
     0
      验证