登录
首页 >  Golang >  Go问答

在 Go 项目中如何编写单元测试并构造对象

来源:stackoverflow

时间:2024-02-17 19:09:21 359浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《在 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 框架,或者推荐的构建这些对象的方法是什么?


解决方案


一个简单的解决方案是:

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{}
  }
  ...
}

终于介绍完啦!小伙伴们,这篇关于《在 Go 项目中如何编写单元测试并构造对象》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>