首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang:如何使用gomock来模拟...interface{}论证

Golang:如何使用gomock来模拟...interface{}论证
EN

Stack Overflow用户
提问于 2016-02-24 20:32:56
回答 2查看 3.8K关注 0票数 7

我有一个Printer接口,它使用标准的go Printf函数签名:

代码语言:javascript
复制
type Printer interface {
    Printf(format string, tokens ...interface{})
}

我希望能够使用戈莫克来模拟这个接口,但我不确定如何正确地设置tokens ...interface{}参数。

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

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

有谁知道更好的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-02-25 00:54:03

目前版本的gomock是不可能的。也许你可以扩展它,并发送一个拉请求进来。要理解为什么不可能,您必须查看为各种函数生成的模拟。

要做到这一点,让我们看一下gomock存储库中的示例,特别是用户/用户。user.go

生成模拟

您将在索引整数中看到一个名为Ellip的函数,它与Printf函数类似:

代码语言:javascript
复制
type Index interface {
    // ...
    Ellip(fmt string, args ...interface{})
    // ...
}

现在,下面是模拟函数对Ellip的外观

代码语言:javascript
复制
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正在创建一个由第一个参数初始化的接口片,_s。然后将各种参数附加到接口的_s中。

因此,首先要说明的是,它不只是将变量参数_param1附加到片中。_param1中的每个变量都通过迭代来追加到新的片中。

这意味着变量参数的切片不被保留。它爆发了。

票数 2
EN

Stack Overflow用户

发布于 2022-04-01 00:14:39

从2017年10月1日起,gomock.Any()为各种args:https://github.com/golang/mock/pull/101正确工作。

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

https://stackoverflow.com/questions/35612500

复制
相关文章

相似问题

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