繁体   English   中英

Golang:如何使用 gomock 模拟...接口{} arguents

[英]Golang: how to mock ...interface{} arguents using gomock

我有一个使用标准 go Printf function 签名的Printer接口:

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

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

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

// 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

生成的模拟

您会在索引接口中看到一个名为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正在创建一个使用第一个参数初始化的接口_s 然后,将可变参数附加到该接口片_s上

因此,很明显,它不只是将可变参数_param1附加到切片。 通过迭代遍历_param1,每个可变参数都附加到新切片上。

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

自 2017 年 10 月 1 日起, gomock.Any()对可变参数可以正常工作: https://github.com/golang/mock/pull/101

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM