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

Dan*_*obe 2 testing unit-testing mocking go

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

Fli*_*mzy 6

创建自己的界面.

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

假设你有一个类型Foo有以下几种方法:Bar(),Baz(),和Qux().

你在代码中使用它:

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

只需更改此选项即可使用新的自定义界面:

type barer interface() {
    Bar() error
}
Run Code Online (Sandbox Code Playgroud)

然后更新您的功能签名:

func Frobnicate(f fooer) err {
    // The rest the same as before
Run Code Online (Sandbox Code Playgroud)

现在创建自己的fooer实现,并嘲笑.

如果你需要模拟的类型是一个带有数据的简单结构,而不是使用方法,你可以用getter/setter方法包装方法,这样一个接口就可以解决它.示例,给定此类型:

type Foo struct {
    Name string
}
Run Code Online (Sandbox Code Playgroud)

您可以创建一个包装器:

type FooWrapper struct {
    Foo
}

func (w *FooWrapper) Name() string {
    return w.Foo.Name
}
Run Code Online (Sandbox Code Playgroud)

现在Foo可以使用自定义界面访问类型以进行模拟.