亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用單元測試在 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。我的問題是,如果我使用這種方法,我將有一堆組件都依賴于接口。實現這些接口的對象的實例應該在哪里構造?最明顯的事情似乎是讓不受任何其他依賴的頂級對象構建其依賴項以及所有依賴項的依賴項等,但這將非?;靵y。我主要使用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 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號