1

我们正在使用 gopkg.in/mgo.v2/bson 与 mongo 对话,它的 API 填充传递的结构而不是返回结果,例如:

func (p *Pipe) One(result interface{}) error {...

当我想模拟/测试使用它的代码时会出现问题。我想模拟这个执行并以某种方式在“结果”中获得 pupulated 值。目前测试有:

query.EXPECT().One(gomock.Any())

所以你可以看到我没有得到任何值,我只是配置 gomock 来检查当我运行我的方法时查询。必须调用一个。我不能像这样传递结构

mystruct := MyStruct{}
query.EXPECT().One(&mystruct)

因为测试代码和实际代码中的 mystruct 是不同的,验证模拟会失败(引用不同)。我正在寻找类似于 mockito 的参数捕获器的东西: https ://static.javadoc.io/org.mockito/mockito-core/2.6.9/org/mockito/ArgumentCaptor.html

4

2 回答 2

3

这可以通过Do来实现。

从poy复制和粘贴 Github 示例。

var capturedArgs []int

someMock.
  EXPECT().
  SomeMethod(gomock.Any()).
  Do(func(arg int){
    capturedArgs = append(capturedArgs, arg)
  })

参考:https ://github.com/golang/mock/pull/149

于 2019-01-21T04:32:58.280 回答
0

这个项目可以帮助你:https ://github.com/bouk/monkey 。您可以替换函数并使用布尔变量来检查使用情况。

called := false    
monkey.Patch(package.One, func(result interface{}) error {
    if result == expected {
       called := true
       return nil
    }
    return errors.new("not expected")
})

不要忘记恢复您原来的功能。

defer monkey.Unpatch(package.One)
于 2018-02-07T10:52:09.443 回答