go单元测试利器
在 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) }
测试用例
(*) () { ..().().() ..().().() ..().(..()).(.()) = ..(.) .() } (*) () { ..().().() ..().().() ..().(..()).(.()) = ..(..()) .() .().(.) }