有没有选择使用类似于mockito参数captor的东西?

时间:2018-02-07 10:43:40

标签: unit-testing go mockito gomock

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

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

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

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

因为你可以看到我没有得到任何价值,我只是配置gomock来检查当我运行我的方法然后query.One必须被调用。 我不能传递像

这样的结构
mystruct := MyStruct{}
query.EXPECT().One(&mystruct)

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

2 个答案:

答案 0 :(得分:1)

这可以通过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

答案 1 :(得分:0)

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

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)