Golang : how to mock . ..interface{} arguents 使用 gomock

标签 go mocking printf gomock

我有一个使用标准 go Printf 函数签名的 Printer 接口(interface):

type Printer interface {
    Printf(format string, tokens ...interface{})
}

我希望能够使用 gomock 模拟此接口(interface),但我不确定如何正确设置 tokens ...interface{} 参数。

我预计 Printf(gomock.Any(), gomock.Any()) 将涵盖所有可能的情况(因为 tokens 编译为 []interface {}),但您似乎需要为 N 个 token 设置显式调用:

// no tokens
mockPrinter.EXPECT().
    Printf(gomock.Any()).
    AnyTimes()

// 1 token
mockPrinter.EXPECT().
    Printf(gomock.Any(), gomock.Any()).
    AnyTimes()

// 2 tokens
mockPrinter.EXPECT().
    Printf(gomock.Any(), gomock.Any(), gomock.Any()).
    AnyTimes()

// ... up to N tokens

有谁知道更好的方法吗?

最佳答案

当前版本的 gomock 不可能。也许您可以扩展它,并发送一个拉取请求。要理解为什么这不可能,您必须查看为可变参数函数生成的模拟。

为此,让我们看一下 gomock 存储库中的示例,特别是 ./sample/mock_user/user.go./sample/mock_user/mock_user.go .

生成的模拟

您将在 Index 界面中看到一个名为 Ellip 的函数,它类似于您的 Printf 函数:

type Index interface {
    // ...
    Ellip(fmt string, args ...interface{})
    // ...
}

现在,Ellip 的模拟函数如下所示:

func (_m *MockIndex) Ellip(_param0 string, _param1 ...interface{}) {
    _s := []interface{}{_param0}
    for _, _x := range _param1 {
        _s = append(_s, _x)
    }
    _m.ctrl.Call(_m, "Ellip", _s...)
}

注意到有什么奇怪的吗?嗯,gomock 正在创建一个接口(interface)片段,_s,用第一个参数初始化。然后它将可变参数附加到该接口(interface)片段 _s

因此,需要明确的是,它不只是将可变参数 _param1 附加到 slice 。 _param1 中的每个单独的可变参数都会通过迭代附加到新 slice 。

这意味着不保留可变参数的 slice 。坏了。

关于Golang : how to mock . ..interface{} arguents 使用 gomock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35612500/

相关文章:

go - 显示结构值的链代码函数

go - 有没有一种方法可以计算Go模板?

python - 如何将 mock.patch 移动到 setUp?

c++ - stm32f4-eval2板的keil中的printf

c++ - 为什么 vsnprintf 是安全的?

matlab - 如何在matlab中使用fprintf简短地编写多个变量?

unit-testing - `go test` 自动化测试的文件修改监控

database - 如何在 go 中编写长时间运行的请求?

javascript - AppSync GraphQL 模拟解析器映射不生成唯一项目

go - 如何使用 testify/mock 在 golang 中模拟数据库层