blog icon indicating copy to clipboard operation
blog copied to clipboard

Go Mock (gomock)简明教程 | 快速入门 | 极客兔兔

Open geektutu opened this issue 4 years ago • 9 comments

https://geektutu.com/post/quick-gomock.html

gomock 是Go语言/golang 官方提供的mock库,用于在单元测试(unit tests) 中模拟一些依赖复杂,难以直接调用的场景,比如网络请求、数据库依赖和文件I/O等。本文介绍了 gomock 的使用方法,包括模拟参数(Any, Nil, Not, Eq)和返回值(Do, Return, DoAndReturn),以及调用次数(Times) 和顺序(InOrder),如何写可测试可mock的代码。

geektutu avatar Feb 14 '20 15:02 geektutu

可以实现, gmock 那种第一次调用返回一个值, 第二次调用返回另外一个值吗?

m.EXPECT().Get(gomock.Any()).Return(1, nil).Return(2, nil).

我试了下不行, 2 会覆盖1

ericuni avatar Jul 02 '20 10:07 ericuni

例子中 db_test.go 的第6行

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

应该是

m.EXPECT().Get(gomock.Eq("Tom")).Return(-1, errors.New("not exist"))

吧。

naoshi avatar Oct 16 '20 10:10 naoshi

@naoshi 感谢指出问题,GetFromDB 写错了,err == nil 写成了 err != nil, 更正为:

func GetFromDB(db DB, key string) int {
	if value, err := db.Get(key); err == nil {
		return value
	}

	return -1
}

当 DB.Get() 的第二个返回值为 err 时,GetFromDB() 固定返回 -1,因此 DB.Get() 第一个返回值 value 可以是任何值,不影响测试用例。

geektutu avatar Oct 16 '20 11:10 geektutu

写错了:NewMockDB() 的定义在 db_mock.go 中,由 mockgen 自动生成。

zouzhiwu avatar Dec 20 '20 10:12 zouzhiwu

@zouzhiwu 已经修复,感谢~

geektutu avatar Dec 20 '20 14:12 geektutu

@ericuni 可以实现, gmock 那种第一次调用返回一个值, 第二次调用返回另外一个值吗?

m.EXPECT().Get(gomock.Any()).Return(1, nil).Return(2, nil).

我试了下不行, 2 会覆盖1

hn-verson avatar Apr 27 '21 09:04 hn-verson

@ericuni 可以实现, gmock 那种第一次调用返回一个值, 第二次调用返回另外一个值吗?

m.EXPECT().Get(gomock.Any()).Return(1, nil).Return(2, nil).

我试了下不行, 2 会覆盖1

要单独写两个才行 m.EXPECT().Get(gomock.Any()).Return(1, nil) m.EXPECT().Get(gomock.Any()).Return(2, nil)

hn-verson avatar Apr 27 '21 09:04 hn-verson

请问,如果这个我要测试控制器要怎么搞。。。。

shuimengzhi avatar Jun 26 '22 13:06 shuimengzhi

@ericuni 可以实现, gmock 那种第一次调用返回一个值, 第二次调用返回另外一个值吗?

m.EXPECT().Get(gomock.Any()).Return(1, nil).Return(2, nil).

我试了下不行, 2 会覆盖1

要单独写两个才行 m.EXPECT().Get(gomock.Any()).Return(1, nil) m.EXPECT().Get(gomock.Any()).Return(2, nil)

但是加上 AnyTimes() 就失效了

Yuu177 avatar Jul 27 '22 07:07 Yuu177