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

时间:2014-03-07 20:26:48

标签: testing go mocking

我是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
  1. 任何人都可以指出我做错了什么?我需要先初始化一个模拟对象吗?在嘲笑方法之前?

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

测试和覆盖范围:

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

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

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/

答案 2 :(得分:-3)

我也是新手,但遇到了同样的问题。您需要安装Bazaar

http://wiki.bazaar.canonical.com/Download

然后安装withmock

go get github.com/qur/withmock
go get github.com/qur/withmock/mocktest

然后在命令行中运行

$> withmock go test