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)