【问题标题】:How to do mock a function using gomock in Go?如何在 Go 中使用 gomock 模拟函数?
【发布时间】:2014-03-07 20:26:48
【问题描述】:

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

sample/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/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
  1. 谁能指出我做错了什么?我需要先初始化一个模拟对象吗?在模拟方法之前?

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

感谢所有帮助.. 谢谢!

【问题讨论】:

  • golang.org/pkg/net/http/httptest 是测试与外部服务对话的代码的好方法。它让您可以自然地编写代码,并让您的测试实际测试您的代码,而不是一些模拟出来的代码。

标签: testing go mocking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    测试和覆盖率:

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

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

    mockgen -destination={put the generated mocks in the file} -package={generate mocks for this package} {generate mocks for this interface}
    

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

    【讨论】:

    • 感谢教程链接。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 2021-12-24
    • 2020-10-11
    • 2013-10-10
    • 1970-01-01
    • 2015-05-28
    • 2022-10-15
    • 2021-11-18
    相关资源
    最近更新 更多