为了账号安全,请及时绑定邮箱和手机立即绑定

使用单元测试在 go 项目中构建对象的位置/方式

使用单元测试在 go 项目中构建对象的位置/方式

Go
慕勒3428872 2022-08-01 15:29:04
我最近一直在做Go项目。为了允许每个组件都是可单元测试的,我一直在遵循几篇文章中指定的模式来更改函数,例如:func WriteObject(obj ObjType) {   dbClient := DBClient{}   dbClient.WriteObject(obj)}  就像:type WriteObject interface {   WriteObject(obj ObjType)}type ProxyWriteObject struct {   dbClient DBClientInterface}func (p * ProxyWriteObject) WriteObject(obj ObjType) {   p.dbClient.WriteObject(obj)}这样我就可以在测试期间模拟dbClient。我的问题是,如果我使用这种方法,我将有一堆组件都依赖于接口。实现这些接口的对象的实例应该在哪里构造?最明显的事情似乎是让不受任何其他依赖的顶级对象构建其依赖项以及所有依赖项的依赖项等,但这将非常混乱。我主要使用Java,所以通常我会使用Dagger/Guice/Spring来构建和注入对象。Go 中是否有类似或推荐的 DI 框架,或者构建这些对象的推荐方法是什么?
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

一个简单的解决方案是:


type DBClientIntf interface {

   WriteObject(ObjType)

}


func WriteObject(obj ObjType,cli DBClientIntf) {

  cli.writeObject(obj)

}

或者,您可以拥有一家工厂:


func WriteObject(obj ObjType,cli func() DBClientIntf) {

  cli().writeObject(obj)

}

或者,全球工厂:


var getDBClient=func() DBClientIntf {

   return DBClient{}

}


func WriteObject(obj ObjType) {

  getDBClient().writeObject(obj)

}

并将全局工厂设置为返回模拟客户端的函数:


func TestWriteObject(t *testing.T) {

   getDBClient=func() DBClient {

     return mockDBClient{}

  }

  ...

}


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信