-
Notifications
You must be signed in to change notification settings - Fork 2
GOOM问题答疑记录
Q: gomonkey好像有个不稳定的报错,有见到过吗? 是不是到goom可以解决稳定性问题?
本地跑了400次都是成功的,上流水线就不稳定。
A:目前发现gomonkey的这个实现有并发问题:
而单测的t.Run(tt.name, func(t *testing.T)在每次执行调用时候底层创建一个新的goroutine的:
goom中不存在这个问题
另外goom修复了double函数被回收的问题,比如gomonkey的这个double函数apply之后并没有对其持有引用,一旦double被回收就会出现一些很奇怪的异常,这个问题是偶现的
A: 这个是mock函数(double)被gc回收导致的 R: 临时解法办法: 替换成使用旧版的gomonkey.ApplyFunc API, 同时对double定义为变量,并且在函数末尾使用runtime.KeepAlive(double)持有变量
A: 我先说一下, 后续补充文档。 方法是在当前包下写一个和fake一样的结构体, 这个结构体的属性和mock的结构属性体保持一致,但是不需要给它定义方法
A: 因为函数是空的,编译后被内联了,因此hook无效。有两种解决办法:
- go test执行加上 -gcflags="-l" 关闭内联
- 在函数定义处加上//go:noinline
我这里的想stub一个私有的【类】,不知道能否做到?多谢答疑~
A: 能支持的,详细请看README.md文档
目前我们的一个服务的所有文件和类都在一个main包下面,有一些类的方法用小写开头的(即所谓的对外隐藏的,实际在一个main包里都是能调的),在接口测试的时候会要mock掉这些方法。
6-12 下午 2:46 还有一种情况是:开放的方法里调了隐藏的方法,在做接口测试的时候想要mock掉某个隐藏的方法
函数我没试过,我试了一下方法,小写就不行,改成大写之后就可以了
A: 这个改成用applyfunc吧: gomonkey.ApplyFunc((&DbAccess{}).batchQry..., func (dbAccess *DbAccess, otherparams...)) 这个错误是gomonkey里加了一个校验, 把校验去掉就可以了 建议做法是,再封装一个gomonkey方法, 把校验去掉。 换个名称比如ApplyMethodFunc()之类的
R: 此问题在GOOM中已解决