首页 > 解决方案 > 在 golang 中模拟依赖项是否需要 DI(依赖项注入)?

问题描述

当我尝试对如下函数进行单元测试时,extern_pkg要模拟的外部包在哪里:

import "extern_pkg"

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

func main() {
  MyFunc()
}

我阅读了一些博客,它们似乎都是通过使用依赖注入修改 prod 代码来实现的。例如,如下所示:

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)
}

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

我的问题是:

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

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

谢谢!

标签: unit-testinggodependency-injection

解决方案


尝试使用 func 类型的 vars 并注入它们。它更容易,不需要更少的代码和接口。见戈迪夫


推荐阅读