Go语言 如何使用从另一个文件导入的接口模拟文件

szqfcxe2  于 2023-03-06  发布在  Go
关注(0)|答案(1)|浏览(113)

我试图使用从另一个文件导入的接口创建文件的模拟。我尝试了"aux_files“和”imports“,但没有成功创建正确的模拟文件。我想我遗漏了一些内容。
所以我有一个'mockgen/main.像这样去:

package main
import (
    "log"
    o "mockgen/otheri"
)

type bar struct {
    a o.Foo
}

func NewBar(a o.Foo) *bar {
    return &bar{a}
}

func main() {
    var t = NewBar(&o.FunctionStuct{})
    if err := t.a.Ask(); err != nil {
        log.Fatal(err)
    }
}

导入的接口在'mockgen/otheri/otheri.go'中:

package otheri

import "log"

type Foo interface {
    Ask() error
}

type FunctionStuct struct {
}

func (f *FunctionStuct) Ask() error {
    log.Println("Hello")
    return nil
}

我尝试的命令是:
mockgen -source main.go -aux_files o=otheri/otheri.go在与main.go相同的级别上执行
但是我的mockgen文件是空的....
有人有什么想法吗?我的目标是模拟o.Foo包含在main中的接口。请不要改变我的架构
我需要模拟它来用单元测试测试它。架构是这样的,因为我遵循清洁架构。谢谢大家

ix0qys7i

ix0qys7i1#

你只能为接口生成模拟。所以,在你的例子中,你应该为mockgen/otheri/otheri.go文件运行mockgen,因为目标接口出现在。
但是正如Elias货车Ootegem所指出的,将接口与符合它的结构体相结合是一种不好的做法,你应该将接口和实现分开,所以,它应该是这样的:
文件/bar/bar.go

package bar

import (
    "log"
)

type Foo interface {
    Ask() error
}

type bar struct {
    foo Foo
}

func NewBar(a Foo) *bar {
    return &bar{a}
}

func (b *bar) Ask() {
    if err := b.foo.Ask(); err != nil {
        log.Fatal(err)
    }
}

文件otheri/otheri.go

package otheri

import "log"

type FunctionStruct struct {
}

func (f *FunctionStruct) Ask() error {
    log.Println("Hello")
    return nil
}

文件main.go

package main

import (
    "bar"
    "otheri"
)

func main() {
    fs := &otheri.FunctionStruct{}
    b := bar.NewBar(fs)
    b.Ask()
}

并生成一个模拟mockgen -source=bar/bar.go -destination=bar/mock/foo_mock.go Foo
此外,遵循effective go the best way to use your FunctionStruct中描述的规则-在包中隐藏类型:
如果类型的存在只是为了实现接口,并且永远不会导出该接口以外的方法,则无需导出类型本身
因此,最终的解决方案将把接口移到一个单独的包中:
文件/foo/foo.go

package foo

type Foo interface {
    Ask() error
}

文件/bar/bar.go

package bar

import (
    "log"
    "foo"
)

type bar struct {
    foo foo.Foo
}

func NewBar(a foo.Foo) *bar {
    return &bar{a}
}

func (b *bar) Ask() {
    if err := b.foo.Ask(); err != nil {
        log.Fatal(err)
    }
}

文件otheri/otheri.go

package otheri

import ( 
   "log"
   "foo"
)

func New() foo.Foo {
    return &functionStruct{}
}

type functionStruct struct {
}

func (f *functionStruct) Ask() error {
    log.Println("Hello")
    return nil
}

文件main.go

package main

import (
    "bar"
    "otheri"
)

func main() {
    b := bar.NewBar(otheri.New())
    b.Ask()
}

和mockgen:mockgen -source=foo/foo.go -destination=foo/mock/foo_mock.go Foo

相关问题