首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中使用gomock来模拟函数?

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

Stack Overflow用户
提问于 2014-03-07 20:26:48
回答 2查看 13.6K关注 0票数 7

我刚开始做一个简单的小项目+做测试的习惯来学习。但是我在使用模拟设置测试时遇到了困难。特别是在设置模拟对象时。

sample/sample.go

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
}

每次我和

代码语言:javascript
复制
go test

我总是犯错误

代码语言:javascript
复制
undefined: sample.MOCK
undefined: sample.EXPECT
  1. 任何人都能指出我做错了什么?我需要先初始化一个模拟对象吗?在嘲笑这个方法之前?
  2. 如果我让GetResponse成为私有的getResponse,我就不能嘲笑它了吧?

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

EN

回答 2

Stack Overflow用户

发布于 2014-03-07 21:44:23

我不是一个gomock专家,但是在阅读了gomock GoDoc页面之后,我发现了您的代码中的几个问题。首先,显然不能使用gomock来模拟包函数(就像您试图使用sample.GetResponse时所做的那样),只能使用接口。第二,根据“标准用法”,你必须

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

Stack Overflow用户

发布于 2019-09-26 17:06:28

测试和覆盖范围:

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

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

代码语言:javascript
复制
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/

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22260037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档