Go最全golang 打桩,mock 数据怎么玩?,2024年最新Golang并发原理解析

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

mockgen -source=foo.go [other options]

Reflect mode generates mock interfaces by building a program

that uses reflection to understand interfaces. It is enabled

by passing two non-flag arguments: an import path, and a

comma-separated list of symbols.

Example:

mockgen database/sql/driver Conn,Driver

-aux_files string

(source mode) Comma-separated pkg=path pairs of auxiliary Go source files.

-build_flags string

(reflect mode) Additional flags for go build.

-copyright_file string

Copyright file used to add copyright header

-debug_parser

Print out parser results only.

-destination string

Output file; defaults to stdout.

-exec_only string

(reflect mode) If set, execute this reflection program.

-imports string

(source mode) Comma-separated name=path pairs of explicit imports to use.

-mock_names string

Comma-separated interfaceName=mockName pairs of explicit mock names to use. Mock names default to ‘Mock’+ interfaceName suffix.

-package string

Package of the generated code; defaults to the package of the input with a ‘mock_’ prefix.

-prog_only

(reflect mode) Only generate the reflection program; write it to stdout and exit.

-self_package string

The full package import path for the generated code. The purpose of this flag is to prevent import cycles in the generated code by trying to include its own package. This can happen if the mock’s package is set to one of its inputs (usually the main one) and the output is stdio so mockgen cannot detect the final output package. Setting this flag will then tell mockgen which import to exclude.

-source string

(source mode) Input Go source file; enables source mode.

-version

Print version.

-write_package_comment

Writes package documentation comment (godoc) if true. (default true)

2021/10/30 16:43:25 Expected exactly two arguments

一般用的比较多的就是

  • -source 源文件

  • -destination 目标文件

  • -imports 依赖的需要 import 的包

  • -build_flags 传递给build工具的参数

  • -aux_files 接口文件不止一个文件时附加文件

  • -package 设置 mock 文件的包名,不设置的话,mock 文件的包名默认是 mock_输入文件的包名

通过上述指令生成的 mock 文件如下:

  • NewMockMyFunc

创建一个新的 mock 实例

  • EXPECT

允许调用者指示预期用途的对象

  • GetInfo

mock 的基础方法,也就是我们需要 mock 的方法

具体的如何使用

=====================================================================

myuser_test.go

  • myuser.go 对应的单测文件 , 使用了 mock 的方式

package myfunc

import (

“fmt”

“testing”

gomock “github.com/golang/mock/gomock”

)

func Test_getUser(t *testing.T) {

mockCtl := gomock.NewController(t)

mockMyFunc := NewMockMyFunc(mockCtl)

mockMyFunc.EXPECT().GetInfo().Return(“xiaomotong”)

v := getUser(mockMyFunc)

if v == “xiaomotong” {

fmt.Println(“get user right!”)

} else {

t.Error(“get error user”)

}

}

看到上述单测文件,可以还不是特别明白区别,我们来看看不用 mock 的时候,我们会是如何去写单测呢

package myfunc

import (

“fmt”

“testing”

gomock “github.com/golang/mock/gomock”

)

func Test_getUser(t *testing.T) {

m := myfunc.CreateMyFunc() // 也就是说需要自己创建一个对象

v := getUser(m)

if v == “xiaomotong” {

fmt.Println(“get user right!”)

} else {

t.Error(“get error user”)

}

}

m := myfunc.CreateMyFunc() 看到上述这一句话,是创建对应的对象,再将该对象作为参数传入到 getUser 函数中,正常情况下这样做单测没有问题

但是如果这个时候创建 MyFunc 对象由于对外部还有依赖导致还没有编码好,可是也不能阻塞我们的单元测试

这个时候使用最上面的 mock 方案就显得尤为重要,可以使用 mock 的方式,mock 一个 MyFunc 对象,并设置好返回值即可完成,如:

mockCtl := gomock.NewController(t)

mockMyFunc := NewMockMyFunc(mockCtl)

mockMyFunc.EXPECT().GetInfo().Return(“xiaomotong”)

执行上述代码结果如下:

go test

get user right!

PASS

ok mygomock/myfunc 0.427s

感兴趣的朋友可以使用起来,用的多了就会更加熟悉

使用 gomock 的好处?

============================================================================

  • gomock 实现了较为完整的基于 interface 的 Mock 功能,能够与 Golang 内置的 testing包良好集成,也能用于其它的测试环境中

  • 学习成本低,很快就能上手

工具需要用起来,才能发挥他的价值,需要的可以用起来吧

欢迎点赞,关注,收藏

========================================================================

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力


好了,本次就到这里
常见技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

力向前行。

[外链图片转存中…(img-6RsgXir0-1715504167194)]
[外链图片转存中…(img-vAyh4Yvd-1715504167194)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值