猿问

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

我最近一直在做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 框架,或者构建这些对象的推荐方法是什么?


慕勒3428872
浏览 90回答 1
1回答

慕虎7371278

一个简单的解决方案是: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{}  }  ...}
随时随地看视频慕课网APP

相关分类

Go
我要回答