github.com/golang/mock/gomock

教程

  1. 安装mockgen go get -u github.com/golang/mock/mockgen

  2. 生成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 }

  1. return -1

}

  1. 需要被mock的接口得到源文件source,生成的目标文件destination,包名package
  2. 3. 新建 db_test.go
  3. ```go
  4. func TestGetFromDB(t *testing.T) {
  5. ctrl := gomock.NewController(t)
  6. defer ctrl.Finish() // 断言 DB.Get() 方法是否被调用
  7. m := NewMockDB(ctrl)
  8. m.EXPECT().Get(gomock.Eq("Tom")).Return(0, errors.New("not exist"))
  9. if v := GetFromDB(m, "Tom"); v != -1 {
  10. t.Fatal("expected -1, but got", v)
  11. }
  12. }

打桩

参数

  1. Eq(value) 表示与 value 等价的值。

m.EXPECT().Get(gomock.Eq(“Tom”)).Return(0, errors.New(“not exist”))

  1. Any() 可以用来表示任意的入参。

m.EXPECT().Get(gomock.Any()).Return(630, nil)

  1. Not(value) 用来表示非 value 以外的值。

m.EXPECT().Get(gomock.Not(“Sam”)).Return(0, nil)

  1. Nil() 表示 None 值

m.EXPECT().Get(gomock.Nil()).Return(0, errors.New(“nil”))

返回值

  1. Return 返回确定的值

m.EXPECT().Get(gomock.Not(“Sam”)).Return(0, nil)

  1. Do Mock 方法被调用时,要执行的操作吗,忽略返回值。
  1. m.EXPECT().Get(gomock.Any()).Do(func(key string) {
  2. t.Log(key)
  3. })
  1. DoAndReturn 可以动态地控制返回值。
  1. m.EXPECT().Get(gomock.Any()).DoAndReturn(func(key string) (int, error) {
  2. if key == "Sam" {
  3. return 630, nil
  4. }
  5. return 0, errors.New("not exist")
  6. })

调用次数

  1. Times() 断言 Mock 方法被调用的次数。

m.EXPECT().Get(gomock.Not(“Sam”)).Return(0, nil).Times(2)

  1. MaxTimes() 最大次数。<br /> MinTimes() 最小次数。<br /> AnyTimes() 任意次数(包括 0 次)。<br />

调用顺序

  1. o1 := m.EXPECT().Get(gomock.Eq("Tom")).Return(0, errors.New("not exist"))
  2. o2 := m.EXPECT().Get(gomock.Eq("Sam")).Return(630, nil)
  3. gomock.InOrder(o1, o2)