golang三大基礎mock大法


一、使用gomonkey來mock函數和方法 

1、mock函數

gomonkey.ApplyFunc(target,double)

其中target是被mock的目標函數,double是用戶重寫的函數。

注意點:重寫的函數要和原函數入參和出參保持一致,否則會報錯。

2、mock方法

gomonkey.ApplyMethod(reflect.TypeOf(s), "target",double  {

//mock方法實現})

s為目標變量,target為目標變量方法名,double為mock方法;同理double方法入參和出參需要和target方法保持一致。如下圖示例:

二、使用sqlmock來mock數據庫

官網鏈接:https://github.com/DATA-DOG/go-sqlmock

實際業務中query語句用的比較多,下面以query語句為例詳細介紹sqlmock的用法(官網樣例鏈接)。官網的示例解析如下圖:

先了解sqlmock的4個大概步驟后,再來看看實際情況中需要注意的點:

1、初始化sqlmock后,需要將sqlmock的db實例賦值給實際調用的數據庫,如下圖所示:
稍微仔細思考下也能夠理解,官網給的示例初始化sqlmock后都沒有指定要mock哪個db,顯然會拋異常。
2、如何mock返回錯誤?

使用WillReturnError方法構造返回錯誤,如下圖所示:

3、gomonkey的ApplyMethod方法能不能替代sqlmock?不能!

如下圖:被測方法為detailDb.Query(),如果使用gomonkey進行mock,則需要重新query方法:

Query方法的入參和出參如下圖:出參包含Rows參數

再來看看Rows結構體,會發現里面的結構十分復雜,根本無法手工構造想要的數據。

綜上,在示例特定場景下,無法使用gomonkey來替代sqlmock

4、sqlmock是否能覆蓋所有sql場景?

目前發現開發底層都使用"github.com/go-sql-driver/mysql"數據庫,都能夠使用sqlmock庫進行mock。

FAQ:sqlmock是否適用於gormdb呢?歡迎大家在下方留言討論哦!

后期我們會根據每個維度陸續寫相關的測試文章,如果你有興趣,請關注我們哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM