亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

用gomock進行mock測試的方法示例

2020-04-01 18:51:03
字體:
來源:轉載
供稿:網友

在開發過程中往往需要配合單元測試,但是很多時候,單元測試需要依賴一些比較復雜的準備工作,比如需要依賴數據庫環境,需要依賴網絡環境,單元測試就變成了一件非常麻煩的事情。舉例來說,比如我們需要請求一個網頁,并將請求回來的數據進行處理。在剛開始的時候,我通常都會先啟動一個簡單的http服務,然后再運行我的單元測試。可是這個單元測試測起來似乎非常笨重。甚至在持續集成過程中,我還為了能夠自動化測試,特意寫了一個腳本自動啟動相應的服務。事情似乎需要進行一些改變。

mock對象就是為了解決上面的問題而誕生的,mock(模擬)對象能夠模擬實際依賴對象的功能,同時又不需要非常復雜的準備工作,你需要做的,僅僅就是定義對象接口,然后實現它,再交給測試對象去使用。

go-mock是專門為go語言開發的mock庫,該庫使用方式簡單,支持自動生成代碼,可以說是不可多得的好工具。下面我就簡單地展示一下go-mock是如何工作的:

首先你需要做的是將依賴下載到本地:

go get github.com/golang/mock/gomockgo get github.com/golang/mock/mockgen

第一個是代碼依賴,第二個是命令行工具(特別好用)。

下面用一個非常簡單的例子來說明gomock是如何工作的:

我在$GOPATH/src目錄下新建一個項目:hellomock,在$GOPATH/src/hellomock目錄下新建hellomock.go,并定義一個接口Talker:

package hellomocktype Talker interface {  SayHello(word string)(response string)}

然后我們需要一個實現了Talker功能的結構體,假設我們有這樣的場景,我們現在有一個迎賓的崗位,需要一個能夠迎賓的迎賓員,當然這個迎賓員可以是一個人,或者是一只鸚鵡。那么我們需要做的是,定義一個Persion結構體(或者是鸚鵡或者是別的什么東西),并實現Talker接口:

person.go

package hellomockimport "fmt"type Person struct{ name string}func NewPerson(name string)*Person{ return &Person{   name:name, }}func (p *Person)SayHello(name string)(word string) { return fmt.Sprintf("Hello %s, welcome come to our company, my name is %s",name,p.name)  }

現在我們的Person已經實現了Talker接口,現在我們讓他發揮作用吧!

現在假設,我們有一個公司,公司有一個迎賓員,也就是我們的前臺妹子,這個妹子實現了Talker接口.她能夠自動向來的客人SayHello:

company.go

package hellomocktype Company struct { Usher Talker}func NewCompany(t Talker) *Company{ return &Company{  Usher:t, }}func ( c *Company) Meeting(gusetName string)string{ return c.Usher.SayHello(gusetName)}

我們的場景已經設計好了,那么我們傳統的話,會如何實現單元測試呢?

company_test.go

package hellomockimport "testing"func TestCompany_Meeting(t *testing.T) {  person := NewPerson("王尼美")  company := NewCompany(person)  t.Log(company.Meeting("王尼瑪"))}

測試之:

/usr/local/go/bin/go test -v hellomock -run ^TestCompany_Meeting$  company_test.go:8: Hello 王尼瑪, welcome come to our company, my name is 王尼美ok   hellomock  0.013s

現在我們構造一個王尼美還是很簡單的,但是我們現在要用mock對象進行模擬,這時mockgen就登場了:

?  hellomock> mkdir mock                                        
?  hellomock> mockgen -source=hellomock.go > mock/mock_Talker.go

這個時候,將會生成mock/mock_Talker.go文件:

需要注意的是,自動生成的文件同源文件在不同的包下,需要新建一個目錄存放

我們并不需要在意生成文件的內容,我們只需要知道如何去使用即可

mock_Talker.go

// Automatically generated by MockGen. DO NOT EDIT!// Source: hellomock.gopackage mock_hellomockimport (  gomock "github.com/golang/mock/gomock")// MockTalker is a mock of Talker interfacetype MockTalker struct {  ctrl   *gomock.Controller  recorder *MockTalkerMockRecorder}// MockTalkerMockRecorder is the mock recorder for MockTalkertype MockTalkerMockRecorder struct {  mock *MockTalker}// NewMockTalker creates a new mock instancefunc NewMockTalker(ctrl *gomock.Controller) *MockTalker {  mock := &MockTalker{ctrl: ctrl}  mock.recorder = &MockTalkerMockRecorder{mock}  return mock}// EXPECT returns an object that allows the caller to indicate expected usefunc (_m *MockTalker) EXPECT() *MockTalkerMockRecorder {  return _m.recorder}// SayHello mocks base methodfunc (_m *MockTalker) SayHello(name string) string {  ret := _m.ctrl.Call(_m, "SayHello", name)  ret0, _ := ret[0].(string)  return ret0}// SayHello indicates an expected call of SayHellofunc (_mr *MockTalkerMockRecorder) SayHello(arg0 interface{}) *gomock.Call {  return _mr.mock.ctrl.RecordCall(_mr.mock, "SayHello", arg0)}

接下來看看如何去使用這個mock對象,新建一個單元測試:

func TestCompany_Meeting2(t *testing.T) {  ctl := gomock.NewController(t)  mock_talker := mock_hellomock.NewMockTalker(ctl)  mock_talker.EXPECT().SayHello(gomock.Eq("王尼瑪")).Return("這是自定義的返回值,可以是任意類型。")  company := NewCompany(mock_talker)  t.Log(company.Meeting("王尼瑪"))  //t.Log(company.Meeting("張全蛋"))}

測試之:

/usr/local/go/bin/go test -v hellomock -run ^TestCompany_Meeting2$  company_test.go:21: 這是自定義的返回值,可以是任意類型。ok   hellomock  0.015s

可以看到,返回的是我們在mock對象上定義的返回值。

需要說明的一點是,mock對象的SayHello可以接受的參數有gomock.Eq(x interface{})和gomock.Any(),前一個要求測試用例入餐嚴格符合x,第二個允許傳入任意參數。比如我們在注釋掉的測試中傳入了"張全蛋",結果報錯,測試失?。?/p>

/usr/local/go/bin/go test -v hellomock -run ^TestCompany_Meeting2$  controller.go:113: no matching expected call: *mock_hellomock.MockTalker.SayHello([張全蛋])exit status 1FAIL  hellomock  0.007s

本文作為拋磚引玉,gomock還有很多高級用法,希望大家能夠自行探索。

參考文章:

https://github.com/golang/mock/blob/master/README.md

https://github.com/grpc/grpc-go/blob/master/Documentation/gomock-example.md

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av影视综合网| 亚洲自拍偷拍区| 一本一道久久a久久精品逆3p| 精品性高朝久久久久久久| 久久免费精品日本久久中文字幕| 国产精品永久在线| 亚洲欧美日韩国产精品| 久久最新资源网| 96国产粉嫩美女| 国产精品视频大全| 亚洲日本中文字幕免费在线不卡| 欧美亚洲第一区| 欧美视频在线观看 亚洲欧| 亚洲一区亚洲二区亚洲三区| 久久久国产精品视频| 91色视频在线导航| 一本色道久久88精品综合| 日韩av资源在线播放| 视频在线观看99| 中文字幕国产精品| 精品国产乱码久久久久久婷婷| 国产成人精品综合| 久久久av免费| 欧美日韩国产成人在线观看| 国产精品久久久久久久久久久久| 国产精品va在线播放我和闺蜜| 亚洲精品视频免费| 欧美性高跟鞋xxxxhd| 精品久久久中文| 欧美激情乱人伦一区| 国产免费一区视频观看免费| 亚洲男人天堂视频| 亚洲国产精品资源| 亚洲香蕉伊综合在人在线视看| 亚洲欧美激情四射在线日| 欧美极品在线视频| 精品中文字幕乱| 在线视频精品一| 欧美中在线观看| 欧美激情在线有限公司| 成人黄色大片在线免费观看| 高清欧美一区二区三区| 国产精品成人一区| 国产精品r级在线| 欧美成人一区在线| 中文字幕av一区| 亚洲天堂av图片| 亚洲美女福利视频网站| 成人免费观看49www在线观看| 国产精品专区h在线观看| 欧美成人精品在线播放| 久久综合电影一区| 日本高清不卡在线| 日本最新高清不卡中文字幕| 91精品在线看| 亚洲第一区在线| 日韩在线中文字| 午夜精品久久久久久久99热| 欧美一区在线直播| 欧美国产第二页| 国产69精品久久久久99| 国产日韩欧美电影在线观看| 日韩极品精品视频免费观看| 亚洲精品美女在线观看| 色老头一区二区三区| 91综合免费在线| 欧美性在线视频| 亚洲女人被黑人巨大进入al| 免费97视频在线精品国自产拍| 亚洲天堂2020| 日韩一区二区在线视频| 亚洲成人精品视频| 91亚洲精品久久久| 国产69久久精品成人看| 人人澡人人澡人人看欧美| xxx欧美精品| 国产91久久婷婷一区二区| 欧美噜噜久久久xxx| 欧美一级视频免费在线观看| 久久精品国产欧美激情| 久久久久久久国产| 久久夜精品va视频免费观看| 欧美插天视频在线播放| 91国产精品视频在线| 热久久美女精品天天吊色| 97国产在线观看| 久久视频在线看| 中文字幕亚洲一区| 亚洲成人在线视频播放| 久久精品国产亚洲精品2020| 97视频在线观看成人| 中文字幕在线观看日韩| 国产亚洲视频中文字幕视频| 亚洲精品一区中文字幕乱码| 亚洲精品按摩视频| 日韩精品在线观| 亚洲在线观看视频网站| 亚洲肉体裸体xxxx137| 国产精品视频永久免费播放| 久久久国产一区二区| 久久久精品在线观看| 欧美中文字幕视频在线观看| 国产成人精品久久久| 亚洲午夜国产成人av电影男同| 欧美在线亚洲在线| 欧美日韩精品二区| 欧美精品videosex牲欧美| 国产区精品视频| 精品精品国产国产自在线| 欧美激情一区二区三区高清视频| 国产精品久久久久久久久久久不卡| 亚洲成人激情视频| 性色av一区二区三区在线观看| 国产精品美女免费看| 日韩国产激情在线| 美女扒开尿口让男人操亚洲视频网站| 国产亚洲欧美一区| 欧美精品生活片| 欧美精品久久久久a| 国产精品欧美一区二区三区奶水| 性亚洲最疯狂xxxx高清| 久久免费国产精品1| 日韩精品在线电影| 久久久之久亚州精品露出| 国产精品ⅴa在线观看h| 国产精品久久久久久网站| 97免费中文视频在线观看| 精品欧美aⅴ在线网站| 亚洲精品成人久久电影| 亚洲激情第一页| 久久久久久成人精品| 最好看的2019年中文视频| 97视频网站入口| 日韩高清av一区二区三区| 亚洲最大的av网站| 国产精品免费视频xxxx| 国产成人精品免高潮费视频| 91精品在线播放| 亚洲国产高清福利视频| 在线日韩欧美视频| 欧美在线性爱视频| 91精品国产综合久久久久久久久| 97免费中文视频在线观看| 欧洲亚洲在线视频| 国产精品十八以下禁看| 欧美中文在线观看国产| 亚洲精品www久久久久久广东| 亚洲国产精久久久久久久| 久久久欧美精品| 一本色道久久88精品综合| 成人激情视频在线观看| 精品久久久久久久大神国产| 亚洲一区二区三区sesese| 亚洲欧洲xxxx| 欧美成人第一页| 欧美视频在线观看免费网址| 日韩欧美国产一区二区| 亚洲人在线视频| 欧美成人在线网站| 欧美老少配视频| 欧美又大粗又爽又黄大片视频| 91美女福利视频高清| 欧美影院成年免费版| 日韩av网站在线|