为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中使用 gomock 模拟函数?

如何在 Go 中使用 gomock 模拟函数?

Go
哆啦的时光机 2021-07-28 17:44:48
我是 Go 新手,正在做简单的小项目 + 做测试习惯来学习..但是我在使用模拟设置测试时遇到了麻烦。特别是在设置模拟对象样品/样品。去package sampleimport (    "fmt"    "net/http")func GetResponse(path, employeeID string) string {    url := fmt.Sprintf("http://example.com/%s/%s", path, employeeID)    // made some request here    // then convert resp.Body to string and save it to value    return value}func Process(path, employeeID string) string {    return GetResponse(path, employeeID)}样本/sample_test.gopackage sample_testimport (     "testing"     "github.com/example/sample" // want to mock some method on this package)func TestProcess(t *testing.T) {     ctrl := gomock.NewController(t)     defer ctrl.Finish()     sample.MOCK()SetController(ctrl)     sample.EXPECT().GetResponse("path", "employeeID").Return("abc")     v := sample.GetResponse("path", "employeeID")     fmt.Println(v)}每次我运行这个go test我总是收到错误undefined: sample.MOCKundefined: sample.EXPECT任何人都可以指出我做错了什么?我需要先初始化一个模拟对象吗?在嘲笑方法之前?如果我将 GetResponse 设为私有 [getResponse],我将无法模拟它,对吗?感谢所有帮助..谢谢!
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

我不是 gomock 专家,但在阅读gomock GoDoc 页面后,我发现您的代码存在几个问题。首先,您显然不能使用 gomock 来模拟包函数(就像您尝试使用 sample.GetResponse 那样),只能使用接口。二、按照“标准用法”,你要

  1. 定义要模拟的接口(例如 FooInterface)

  2. 使用 mockgen 从该接口生成模拟

  3. 使用函数 NewMockFooInterface() 创建一个 mockObj

  4. 然后 mockObj 将拥有您想要调用的方法(即 EXPECT())


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信