我试图使用从另一个文件导入的接口创建文件的模拟。我尝试了"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中的接口。请不要改变我的架构
我需要模拟它来用单元测试测试它。架构是这样的,因为我遵循清洁架构。谢谢大家
1条答案
按热度按时间ix0qys7i1#
你只能为接口生成模拟。所以,在你的例子中,你应该为
mockgen/otheri/otheri.go
文件运行mockgen,因为目标接口出现在。但是正如Elias货车Ootegem所指出的,将接口与符合它的结构体相结合是一种不好的做法,你应该将接口和实现分开,所以,它应该是这样的:
文件
/bar/bar.go
文件
otheri/otheri.go
文件
main.go
并生成一个模拟
mockgen -source=bar/bar.go -destination=bar/mock/foo_mock.go Foo
此外,遵循effective go the best way to use your
FunctionStruct
中描述的规则-在包中隐藏类型:如果类型的存在只是为了实现接口,并且永远不会导出该接口以外的方法,则无需导出类型本身
因此,最终的解决方案将把接口移到一个单独的包中:
文件
/foo/foo.go
文件
/bar/bar.go
文件
otheri/otheri.go
文件
main.go
和mockgen:
mockgen -source=foo/foo.go -destination=foo/mock/foo_mock.go Foo