Unit testing 什么';当依赖项不存在时,在GO中模拟依赖项的最佳方法是';不要暴露接口

Unit testing 什么';当依赖项不存在时,在GO中模拟依赖项的最佳方法是';不要暴露接口,unit-testing,testing,go,mocking,Unit Testing,Testing,Go,Mocking,我试着去嘲笑,结果证明这是一场噩梦。我通常使用gomock,但我不能,因为dep没有接口文件。最好的方法是什么?创建自己的接口 它甚至不需要完整,它只需要涵盖您实际使用的方法 假设您有一个具有以下方法的类型Foo:Bar(),Baz(),和Qux() 您可以在代码中使用: func Frobnicate(f *Foo) err { if err := f.Bar() error; err != nil { return err } return nil }

我试着去嘲笑,结果证明这是一场噩梦。我通常使用gomock,但我不能,因为dep没有接口文件。最好的方法是什么?

创建自己的接口

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

假设您有一个具有以下方法的类型
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
现在创建您自己的
foore
实现,并模仿

如果需要模拟的类型是带有数据的简单结构,而不是带有方法的简单结构,则可以使用getter/setter方法包装该方法,以便接口可以围绕它工作。例如,给定此类型:

type Foo struct {
    Name string
}
您可以创建包装器:

type FooWrapper struct {
    Foo
}

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

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

您可以自己为包的任何导出功能定义接口,记住Go中的接口是隐式实现的。@mkopriva这是我一直试图做的,但问题是我必须返回在包中创建的结构来创建接口,这会导致许多问题。具体问题是什么?你介意用这些具体问题的描述来更新你的问题吗?这很好,你介意详细说明getter/setter的想法吗