github.com/golang/mock/gomock
教程
安装mockgen go get -u github.com/golang/mock/mockgen
生成db_mock.go mockgen -source=db.go -destination=db_mock.go -package=main ```go // db.go type DB interface { Get(key string) (int, error) }
func GetFromDB(db DB, key string) int { if value, err := db.Get(key); err != nil { return value }
return -1
}
需要被mock的接口得到源文件source,生成的目标文件destination,包名package
3. 新建 db_test.go
```go
func TestGetFromDB(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish() // 断言 DB.Get() 方法是否被调用
m := NewMockDB(ctrl)
m.EXPECT().Get(gomock.Eq("Tom")).Return(0, errors.New("not exist"))
if v := GetFromDB(m, "Tom"); v != -1 {
t.Fatal("expected -1, but got", v)
}
}
打桩
参数
Eq(value) 表示与 value 等价的值。
m.EXPECT().Get(gomock.Eq(“Tom”)).Return(0, errors.New(“not exist”))
Any() 可以用来表示任意的入参。
m.EXPECT().Get(gomock.Any()).Return(630, nil)
Not(value) 用来表示非 value 以外的值。
m.EXPECT().Get(gomock.Not(“Sam”)).Return(0, nil)
Nil() 表示 None 值
m.EXPECT().Get(gomock.Nil()).Return(0, errors.New(“nil”))
返回值
Return 返回确定的值
m.EXPECT().Get(gomock.Not(“Sam”)).Return(0, nil)
Do Mock 方法被调用时,要执行的操作吗,忽略返回值。
m.EXPECT().Get(gomock.Any()).Do(func(key string) {
t.Log(key)
})
DoAndReturn 可以动态地控制返回值。
m.EXPECT().Get(gomock.Any()).DoAndReturn(func(key string) (int, error) {
if key == "Sam" {
return 630, nil
}
return 0, errors.New("not exist")
})
调用次数
Times() 断言 Mock 方法被调用的次数。
m.EXPECT().Get(gomock.Not(“Sam”)).Return(0, nil).Times(2)
MaxTimes() 最大次数。<br /> MinTimes() 最小次数。<br /> AnyTimes() 任意次数(包括 0 次)。<br />
调用顺序
o1 := m.EXPECT().Get(gomock.Eq("Tom")).Return(0, errors.New("not exist"))
o2 := m.EXPECT().Get(gomock.Eq("Sam")).Return(630, nil)
gomock.InOrder(o1, o2)