geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。
https://geektutu.com
Apache License 2.0
166 stars 21 forks source link

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

Open geektutu opened 4 years ago

geektutu commented 4 years ago

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的代码。

ericuni commented 4 years ago

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

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

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

naoshi commented 3 years ago

例子中 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"))

吧。

geektutu commented 3 years ago

@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 可以是任何值,不影响测试用例。

zouzhiwu commented 3 years ago

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

geektutu commented 3 years ago

@zouzhiwu 已经修复,感谢~

hn-verson commented 3 years ago

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

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

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

hn-verson commented 3 years ago

@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)

shuimengzhi commented 2 years ago

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

Yuu177 commented 1 year ago

@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() 就失效了