亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 用gomock進行mock測試的方法示例

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

熱門標簽:中國地圖標注省會高清 學海導航地圖標注 江西轉化率高的羿智云外呼系統 西部云谷一期地圖標注 廣州呼叫中心外呼系統 地圖標注的汽車標 高德地圖標注口訣 南通如皋申請開通400電話 浙江高速公路地圖標注

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

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

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

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

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

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

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

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

package hellomock

type Talker interface {
  SayHello(word string)(response string)
}

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

person.go

package hellomock

import "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 hellomock

type 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 hellomock

import "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.go

package mock_hellomock

import (
  gomock "github.com/golang/mock/gomock"
)

// MockTalker is a mock of Talker interface
type MockTalker struct {
  ctrl   *gomock.Controller
  recorder *MockTalkerMockRecorder
}

// MockTalkerMockRecorder is the mock recorder for MockTalker
type MockTalkerMockRecorder struct {
  mock *MockTalker
}

// NewMockTalker creates a new mock instance
func 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 use
func (_m *MockTalker) EXPECT() *MockTalkerMockRecorder {
  return _m.recorder
}

// SayHello mocks base method
func (_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 SayHello
func (_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,第二個允許傳入任意參數。比如我們在注釋掉的測試中傳入了"張全蛋",結果報錯,測試失敗:

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

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

您可能感興趣的文章:
  • 使用Gomock進行單元測試的方法示例

標簽:德宏 保定 貴州 吐魯番 東營 曲靖 許昌 常州

巨人網絡通訊聲明:本文標題《用gomock進行mock測試的方法示例》,本文關鍵詞  用,gomock,進行,mock,測試,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《用gomock進行mock測試的方法示例》相關的同類信息!
  • 本頁收集關于用gomock進行mock測試的方法示例的相關信息資訊供網民參考!
  • 推薦文章
    日本免费区| 精品久久久久久综合网| 一级女人毛片人一女人| 日韩一级黄色| 国产成a人片在线观看视频| 四虎论坛| 国产视频一区二区在线观看| 精品视频在线观看视频免费视频| 国产不卡在线观看| 国产视频一区二区三区四区| 韩国三级视频网站| 精品久久久久久综合网| 精品久久久久久中文字幕一区| 91麻豆国产福利精品| 久久精品欧美一区二区| 国产极品精频在线观看| 国产成人精品综合| 青青青草影院 | 欧美另类videosbestsex| 99色精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲天堂一区二区三区四区| 国产综合成人观看在线| 天天色色网| 91麻豆精品国产自产在线| 韩国毛片 免费| 久久精品成人一区二区三区| 色综合久久天天综合绕观看| 欧美一级视频免费观看| 麻豆网站在线看| 一级毛片视频在线观看| 欧美激情一区二区三区视频 | 国产高清在线精品一区二区| 精品国产三级a| 日韩专区在线播放| 四虎论坛| 国产91精品系列在线观看| 99色视频在线| 久久国产精品永久免费网站| 夜夜操网| 国产网站免费| 国产伦精品一区二区三区无广告| 91麻豆精品国产自产在线观看一区| 天天做日日干| 精品视频在线观看一区二区| 日本免费乱理伦片在线观看2018| 一本高清在线| 成人在免费观看视频国产| 中文字幕一区二区三区 精品| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日本在线不卡视频| 台湾美女古装一级毛片| 日韩一级精品视频在线观看| 香蕉视频三级| 日本在线www| 国产伦精品一区二区三区无广告| 国产一区二区精品在线观看| 久久国产精品自线拍免费| 日韩中文字幕在线亚洲一区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 91麻豆国产福利精品| 在线观看导航| 韩国毛片免费| 99久久精品费精品国产一区二区| 欧美激情一区二区三区视频 | 亚洲第一页乱| 亚洲第一色在线| 精品视频在线观看一区二区三区| 国产欧美精品| 国产一区免费观看| 欧美a免费| 麻豆午夜视频| 色综合久久久久综合体桃花网| 亚洲 欧美 91| 久久国产一久久高清| 色综合久久天天综合绕观看| 国产成人精品在线| 精品久久久久久中文字幕2017| 精品美女| 国产韩国精品一区二区三区| 美女免费精品高清毛片在线视| 日本伦理网站| 日韩中文字幕一区二区不卡| 精品国产一区二区三区久| 中文字幕一区二区三区精彩视频 | 久久精品大片| 久久国产精品自由自在| 免费国产在线观看| 青草国产在线| 久草免费在线色站| 亚洲天堂免费观看| 高清一级做a爱过程不卡视频| 精品在线视频播放| 国产伦理精品| 日韩欧美一及在线播放| 久久99爰这里有精品国产| 你懂的日韩| 国产美女在线观看| 99久久精品费精品国产一区二区| 国产麻豆精品高清在线播放| 国产国产人免费视频成69堂| 精品国产一区二区三区久久久蜜臀| 91麻豆精品国产综合久久久| 欧美国产日韩精品| 美国一区二区三区| 国产麻豆精品免费视频| 香蕉视频三级| 99热热久久| 日韩在线观看视频免费| 精品国产一区二区三区免费| 精品国产香蕉在线播出| 韩国毛片免费大片| 国产高清视频免费观看| 国产网站麻豆精品视频| 国产成人啪精品| 国产91精品系列在线观看| 中文字幕一区二区三区 精品| 日本在线不卡免费视频一区| 999久久狠狠免费精品| 国产成人精品综合| 午夜久久网| 国产一区二区精品久久| 亚洲www美色| 天天做人人爱夜夜爽2020毛片| 久久99爰这里有精品国产| 欧美激情一区二区三区视频| 天天色色网| 成人av在线播放| 精品国产香蕉在线播出 | 国产一级生活片| 国产美女在线一区二区三区| 日韩av东京社区男人的天堂| 九九精品在线播放| 精品视频免费在线| 国产成人精品影视| 国产91精品系列在线观看| 欧美另类videosbestsex久久| 黄视频网站在线观看| 日本特黄特色aa大片免费| 欧美另类videosbestsex久久| 欧美大片一区| 国产91素人搭讪系列天堂| 国产91精品一区| 91麻豆精品国产综合久久久| 99色吧| 国产高清在线精品一区二区 | 国产伦久视频免费观看视频| 久久国产一久久高清| 日韩av成人| 国产亚洲免费观看| 韩国三级香港三级日本三级| 香蕉视频亚洲一级| 国产精品12| 欧美1卡一卡二卡三新区| 久久精品免视看国产明星| 九九久久国产精品| 欧美激情一区二区三区中文字幕| 日日日夜夜操| 久草免费在线色站| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲www美色| 国产一区二区高清视频| 亚洲精品影院| 国产韩国精品一区二区三区| 成人高清免费| 成人高清护士在线播放| 一级女性全黄久久生活片| 可以免费看毛片的网站| 国产a网| 99久久精品国产片| 国产网站免费视频| 久久国产精品自线拍免费| 欧美另类videosbestsex视频| 台湾美女古装一级毛片| 韩国毛片 免费| 亚洲第一页乱| 国产综合91天堂亚洲国产| 97视频免费在线观看| 天堂网中文字幕| 亚洲第一视频在线播放| 国产伦久视频免费观看 视频| 欧美电影免费| 99色视频在线观看| 日韩av片免费播放| 99热精品在线| 免费毛片播放| 人人干人人插| 日韩avdvd| 免费国产在线观看| 欧美a级大片| 日韩av东京社区男人的天堂| 亚欧成人乱码一区二区| 精品国产亚洲人成在线| 久久国产精品只做精品| 国产a网| 日韩专区在线播放| 久久99爰这里有精品国产| 国产不卡在线看| 夜夜操网| 免费国产在线观看|