当依赖项不公开接口时,在GO中模拟依赖项的最佳方法是什么

时间:2017-04-21 19:38:50

标签: unit-testing testing go mocking

我试图嘲笑https://gopkg.in/olivere/elastic.v2并且它被证明是一场噩梦。我通常使用gomock但我不能因为没有dep的接口文件。什么是最好的方法呢?

1 个答案:

答案 0 :(得分:6)

创建自己的界面。

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

假设您的类型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类型进行模拟。