go - 我可以模拟一个需要使用的带有指针参数的函数吗

标签 go gomock

假设我们有一个库提供了一个函数 Double 来加倍整数,我们使用指针 i 来获取结果值而不是通过返回:

package api

type Action interface {
    Double(i *int) error
}

type NUM struct{}

func (n NUM) Double(i *int) error {
    *i *= 2

    return nil
}

在我们的主要功能中,我们使用这个库来完成我们的任务。像这样:

package app

import (
    "fmt"
    "github.com/hotsnow/api"
)

func main() {
    j := job{a: &api.NUM{}}
    d := j.task(3)
    fmt.Println(3, d)
}

type job struct {
    a api.Action
}

// double me
func (j job) task(i int) int {
    j.a.Double(&i)

    return i
}

现在我们要测试task()函数,如何通过mock Double函数获取指针返回?

这是测试:

package app

import (
    "github.com/golang/mock/gomock"
    "github.com/hotsnow/mocks"
    "testing"
)

func TestReq(t *testing.T) {
    ctrl := gomock.NewController(t)
    defer ctrl.Finish()

    m := mocks.NewMockAction(ctrl)
    m.EXPECT().Double(gomock.Any()).Return(nil)

    j := job{a: m}
    got := j.task(3)
    if got != 6 {
        t.Errorf("got = %#v; want 6", got)
    }
}

这里的代码:https://github.com/hotsnow/mock.git (计算器分支)

最佳答案

你可以使用 gomock setarg这个功能

yourPackage.EXPECT().insert(&pointer).SetArg(0, newPointer)

关于go - 我可以模拟一个需要使用的带有指针参数的函数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59385184/

相关文章:

go - Chromedp 不在 ActionFunc 的循环内执行操作

go - 查找模块的版本

unit-testing - 如何确保所有异步函数在执行 defer 之前运行

ruby-on-rails - golang 解码 websocket-rails JSON 响应

google-app-engine - Google App Engine 任务队列 : googleapi: Error 500: Backend Error

go - 如何设置模拟函数的返回值?

gomock, Go,芒果包,MongoMock

go - 如何在 Go 中查找对象的类型?

postgresql - 戈朗 : gorm use Find(&model) for non gorm migrate table