在golang中模拟依赖项是否需要DI(依赖项注入)?

时间:2019-12-23 12:34:40

标签: unit-testing go dependency-injection

当我尝试对以下功能进行单元测试时,其中extern_pkg是要模拟的外部软件包:

import "extern_pkg"

func MyFunc() {
  ...
  extern_pkg.F()
}

func main() {
  MyFunc()
}

我读了一些博客,他们似乎都通过使用依赖注入修改产品代码来实现这一目标。例如,如下:

type exter interface {
  F()
}

func MyFunc(e exter) {
  ...
  e.F()
}

type extpkg struct{}

func (extpkg) F() {extern_pkg.F()}

func main() {
  epkg := extpkg{}
  MyFunc(epkg)
}

然后在测试代码中,创建一个满足exter接口的模拟对象,并将其作为参数传递给MyFunc

我的问题是:

  1. 如果MyFunc函数包含许多要模拟的外部程序包,我是否需要将每个DI都作为函数参数?函数所依赖的任何全局变量是否也正确?
var global_var

func MyFunc() {
  ...
  extern_pkg1.F()
  ...
  extern_pkg2.G()
  ...
  extern_pkg3.H()
  ...
  global_var
}
  1. 是否有避免修改产品代码的方法?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试使用func类型的变量并将其注入。这样比较容易,不需要较少的代码和接口。参见godif