go mock模擬接口的實現(xiàn)
簡介
mock翻譯過來是‘模擬’的意思,也就是模擬接口返回的信息,用已有的信息替換接口返回的信息,從而提供仿真環(huán)境,實現(xiàn)模擬數(shù)據(jù)下的功能測試;
在多人合作編碼時,你寫的一個函數(shù)func DoSth(People)用到了別人寫的People接口。此時你的函數(shù)已經(jīng)寫好了,但是實現(xiàn)People接口的程序員還在磨蹭,而這時你想要測試func DoSth()是否正確運行,就需要gomock接口模擬技術。
導包
安裝gomock包以及mockgen(mock代碼生成器)
go get -u github.com/golang/mock/gomock go install github.com/golang/mock/mockgen
使用步驟
1.構造代碼
type People interface { ?? ?GetName() string ?? ?GetAge() int } func GetPeopleInfo(people People) { ?? ?//調(diào)用接口 ?? ?println("name:", people.GetName(), "age:", people.GetAge()) }
示例構造了一個函數(shù)GetPeopleInfo(People),調(diào)用了People接口。
2.使用mockgen生成mock代碼
mockgen主要有兩種使用方式:
1.通過source構建:從源文件生成 mock 接口(通過 -source 啟用)
mockgen -source=foo.go [other options]
2.通過reflect構建:通過使用反射程序來生成 mock 接口。它通過傳遞兩個非標志參數(shù)來啟用:導入路徑和逗號分隔的接口列表
mockgen database/sql/driver Conn,Driver
具體參數(shù)可以在命令行輸入mockgen進行查看。
本文中使用2進行mock代碼的構建
代碼結(jié)構:
Test ├── gomock2 └── db.go
使用的mockgen命令:
mockgen -destination db_mock.go -package gomock2 Test/gomock2 People
-destination db_mock.go:表明生成的mock代碼存放在db_mock.go
-package gomock2:生成代碼所屬包名為gomock2
Test/gomock2 People :對Test/gomock2下的People接口進行模擬
成功后會生成db_mock.go文件。
3.建立測試用例
func TestGetFromDB(t *testing.T) { ??? ?//創(chuàng)建mock控制器,控制器 ?? ?controller := gomock.NewController(t) ?? ?defer controller.Finish()//觸發(fā)最后的斷言 ?? ?mockPeople := NewMockPeople(controller) ?? ?mockPeople.EXPECT().GetName().Return("yi") ?? ?mockPeople.EXPECT().GetAge().Return(18).Times(1) //預計返回18并被調(diào)用1次 ?? ?//調(diào)用測試方法? ?? ?GetPeopleInfo(mockPeople) }
主要有下面幾個步驟:
1.創(chuàng)建mock控制器,控制器定義了mock對象的作用域、生命周期、期待值。
2. defer controller.Finish():觸發(fā)斷言,判斷結(jié)果是否符合預期。
3. 創(chuàng)建Mock對象:Mock對象實現(xiàn)了要模擬的接口。
4. 設計預期值,接口的輸入、返回。
5. 調(diào)用測試方法。
go:generate生成mock代碼
在interface所對應的go文件中加入注釋:
//go:generate mockgen -destination db_mock.go -package gomock2 Test/gomock2 People
隨后在命令行的當前目錄下執(zhí)行下面語句就能自動生成mock代碼
go generate
或者在項目根目錄輸入,執(zhí)行當前項目中所有go:generate注釋表示的內(nèi)容。
go generate ./...
到此這篇關于go mock模擬接口的實現(xiàn)的文章就介紹到這了,更多相關go mock模擬接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
GO使用socket和channel實現(xiàn)簡單控制臺聊天室
今天小編給大家分享一個簡單的聊天室功能,聊天室主要功能是用戶可以加入離開聊天室,實現(xiàn)思路也很簡單明了,下面小編給大家?guī)砹送暾a,感興趣的朋友跟隨小編一起看看吧2021-12-12一文帶大家了解Go語言中的內(nèi)聯(lián)優(yōu)化
內(nèi)聯(lián)優(yōu)化是一種常見的編譯器優(yōu)化策略,通俗來講,就是把函數(shù)在它被調(diào)用的地方展開,這樣可以減少函數(shù)調(diào)用所帶來的開銷,本文主要為大家介紹了Go中內(nèi)聯(lián)優(yōu)化的具體使用,需要的可以參考下2023-05-05