【问题标题】:What's the best way to mock a dependency in GO when the dependency doesn't expose an interface当依赖项不公开接口时,在 GO 中模拟依赖项的最佳方法是什么
【发布时间】:2017-04-21 19:38:49
【问题描述】:

我试图模拟https://gopkg.in/olivere/elastic.v2,事实证明这是一场噩梦。我通常使用 gomock 但我不能,因为没有用于 dep 的接口文件。解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您可以为包的任何导出功能自行定义接口,记住 Go 中的接口是隐式实现的。
  • @mkopriva 这是我一直在尝试做的,但问题是我必须返回在包中创建的结构来创建我的界面,这会导致一些问题
  • 具体有什么问题?您介意用这些具体问题的描述更新您的问题吗?

标签: unit-testing testing go mocking


【解决方案1】:

创建您自己的界面。

它甚至不需要完整,它只需要涵盖你实际使用的方法。

假设您有一个类型 Foo,具有以下方法:Bar()Baz()Qux()

你在你的代码中使用它:

func Frobnicate(f *Foo) err {
    if err := f.Bar() error; err != nil {
        return err
    }
    return nil
}

只需更改它以使用您的新自定义界面:

type barer interface() {
    Bar() error
}

然后更新你的函数签名:

func Frobnicate(f fooer) err {
    // The rest the same as before

现在创建您自己的 fooer 实现,然后进行模拟。

如果您需要模拟的类型是带有数据的简单结构,而不是带有方法的结构,您可以使用 getter/setter 方法包​​装该方法,以便接口可以解决它。示例,给定这种类型:

type Foo struct {
    Name string
}

你可以创建一个包装器:

type FooWrapper struct {
    Foo
}

func (w *FooWrapper) Name() string {
    return w.Foo.Name
}

现在可以使用自定义接口访问 Foo 类型以进行模拟。

【讨论】:

  • 这太好了,你介意详细说明一下 getter/setter 的想法吗
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
相关资源
最近更新 更多