一、使用gomonkey来mock函数和方法
1、mock函数
gomonkey.ApplyFunc(target,double)
其中target是被mock的目标函数,double是用户重写的函数。
![](https://ask.qcloudimg.com/http-save/751946/kvwy9tnb4o.jpeg?imageView2/2/w/1620)
注意点:重写的函数要和原函数入参和出参保持一致,否则会报错。
2、mock方法
gomonkey.ApplyMethod(reflect.TypeOf(s), "target",double {
//mock方法实现})
s为目标变量,target为目标变量方法名,double为mock方法;同理double方法入参和出参需要和target方法保持一致。如下图示例:
![](https://ask.qcloudimg.com/http-save/751946/h05qob8psb.jpeg?imageView2/2/w/1620)
二、使用sqlmock来mock数据库
官网链接:https://github.com/DATA-DOG/go-sqlmock
实际业务中query语句用的比较多,下面以query语句为例详细介绍sqlmock的用法(官网样例链接)。官网的示例解析如下图:
![](https://ask.qcloudimg.com/http-save/751946/ddxc1sj4i7.jpeg?imageView2/2/w/1620)
先了解sqlmock的4个大概步骤后,再来看看实际情况中需要注意的点:
1、初始化sqlmock后,需要将sqlmock的db实例赋值给实际调用的数据库,如下图所示:
![](https://ask.qcloudimg.com/http-save/751946/p7pgpk9wax.jpeg?imageView2/2/w/1620)
稍微仔细思考下也能够理解,官网给的示例初始化sqlmock后都没有指定要mock哪个db,显然会抛异常。
2、如何mock返回错误?
使用WillReturnError方法构造返回错误,如下图所示:
![](https://ask.qcloudimg.com/http-save/751946/zb0h33k04m.jpeg?imageView2/2/w/1620)
3、gomonkey的ApplyMethod方法能不能替代sqlmock?不能!
如下图:被测方法为detailDb.Query(),如果使用gomonkey进行mock,则需要重新query方法:
![](https://ask.qcloudimg.com/http-save/751946/s18buvo68b.jpeg?imageView2/2/w/1620)
Query方法的入参和出参如下图:出参包含Rows参数
![](https://ask.qcloudimg.com/http-save/751946/5mwijapupt.jpeg?imageView2/2/w/1620)
再来看看Rows结构体,会发现里面的结构十分复杂,根本无法手工构造想要的数据。
![](https://ask.qcloudimg.com/http-save/751946/euccnh2mcj.jpeg?imageView2/2/w/1620)
综上,在示例特定场景下,无法使用gomonkey来替代sqlmock
4、sqlmock是否能覆盖所有sql场景?
目前发现开发底层都使用"github.com/go-sql-driver/mysql"数据库,都能够使用sqlmock库进行mock。
FAQ:sqlmock是否适用于gormdb呢?欢迎大家在下方留言讨论哦!
后期我们会根据每个维度陆续写相关的测试文章,如果你有兴趣,请关注我们哦。