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

sar*_*roz 4 testing mocking go

我是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)
}
Run Code Online (Sandbox Code Playgroud)

采样/ 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)
}
Run Code Online (Sandbox Code Playgroud)

我每次都跑这个

go test
Run Code Online (Sandbox Code Playgroud)

我总是得到错误

undefined: sample.MOCK
undefined: sample.EXPECT
Run Code Online (Sandbox Code Playgroud)
  1. 任何人都可以指出我做错了什么?我需要先初始化一个模拟对象吗?在嘲笑这个方法之前?

  2. 如果我将GetResponse设为私有[getResponse],我将无法模拟它吗?

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

rob*_*b74 6

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

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


小智 5

测试和覆盖范围:

\n\n
    \n
  1. 接口 --> 接口是方法签名的命名集合。接口是 Go 的关键部分。\n使用基于接口的结构是一种很好的做法,可以确保您的代码与任何特定依赖项的耦合程度较低。此外,接口允许高效、简单和结构化的测试。
  2. \n
  3. GoMock 是 Go 编程语言的模拟框架。作为 github.com/golang 组织的一部分,它享有一定的官方地位。它与Go内置的测试包集成良好,并提供灵活的期望API。
  4. \n
  5. 我们需要 gomock 包(由我们的依赖管理机制处理)以及mockgen 代码生成工具(包含要设置为 PATH 变量的mockgen.exe 的文件夹)来进行测试\nGoMock 的使用遵循四个基本步骤:\n\n
      \n
    1. 使用mockgen 为您想要模拟的接口生成模拟。
    2. \n
    3. 在您的测试中,创建一个 gomock.Controller 实例并将其传递给您的模拟对象\xe2\x80\x99s 构造函数以获取模拟对象。
    4. \n
    5. 在您的模拟上调用 EXPECT() 以设置它们的期望和返回值
    6. \n
    7. 在模拟控制器上调用 Finish() 来断言模拟 \xe2\x80\x99s 期望(我们使用 testify 进行断言)
    8. \n
  6. \n
\n\n

有关如何使用mockgen为我们的接口生成模拟的更多信息,请参阅 \xe2\x86\x92 https://github.com/golang/mock \nan 生成模拟接口文件的mockgen命令示例 ->

\n\n
mockgen -destination={put the generated mocks in the file} -package={generate mocks for this package} {generate mocks for this interface}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关更多信息,请参阅 --> https://blog.codecentric.de/en/2017/08/gomock-tutorial/

\n