测试 – 如何在Go中使用gomock模拟一个函数?

我是Go的新手,做一个小的简单项目,做测试习惯学习..但我在使用mock设置测试时遇到了麻烦.特别是在设置模拟对象时

采样/ sample.go

package sample
import (
    "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.go

package sample_test
import (
     "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.MOCK
undefined: sample.EXPECT

>任何人都可以指出我做错了什么?我需要先初始化一个模拟对象吗?在嘲笑这个方法之前?
>如果我将GetResponse设为私有[getResponse],我将无法模拟它吗?

感谢所有的帮助..谢谢!

最佳答案 我不是gomock专家,但在阅读
the gomock GoDoc page之后,我发现你的代码有几个问题.首先,您显然无法使用gomock来模拟包函数(正如您尝试使用sample.GetResponse),只能使用接口.其次,根据“标准用法”,你必须

>定义要模拟的接口(例如FooInterface)
>使用mockgen从该接口生成模拟
>使用函数NewMockFooInterface()创建一个mockObj
> mockObj将拥有你想要调用的方法(即EXPECT())

点赞