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

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

如何使用相互依賴的接口方法來模擬結構

如何使用相互依賴的接口方法來模擬結構

Go
呼啦一陣風 2023-08-14 14:55:26
我在 Go 中為相當常見的用例/模式編寫單元測試時遇到困難。如果你愿意的話,想象一下這樣的事情:package maintype Resource struct {    name string}type ResourceManager interface {    GetResource(id string) (*Resource, error)    GetAllResources() ([]*Resource, error)}type ResourceManagerImpl struct {}func (r *ResourceManagerImpl) GetResource(id string) (*Resource, error) {    resource := &Resource{}    var err error    // fetch resource.    // ...    return resource,  err}func (r *ResourceManagerImpl) GetAllResources() ([]*Resource, error) {    var resources []*Resource    var err error    // for _, id := range ids {    //  resource = r.GetResource(id)    //  resources = append(resources, resource)    // }    return resources, err}根據需要重復GetAllResources調用是一種常見的模式。GetResource我可以使用gomockortestify來測試 的所有排列GetResource。但是,在測試時GetAllResource,我想模擬GetResource。否則,測試將變成一場噩夢。easymock這就是在 Java 中使用部分模擬的方式mockito。但是,尚不清楚如何在 Golang 中實現同樣的效果。具體來說,我找不到如何部分模擬struct. 大多數建議都圍繞著打破這樣的struct問題,但在這種情況下,這struct已經是最低限度了。ResourceManager為了測試的目的,不要破壞接口(分為單個和多個)似乎是一個公平的要求,因為這沒有多大意義,充其量也是笨拙的,而且隨著更多此類方法進入接口,也無法很好地擴展。
查看完整描述

1 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

遇到這種情況我是這樣處理的:


func (r *ResourceManagerImpl) GetAllResources() ([]*Resource, error) {

   return getAllResources(r)

}



func getAllResources(r ResourceManager) ([]*Resource,error) {

  ...

}

然后您進行測試getAllResources,而不是GetAllResources使用模擬的r. GetAllResources如果您遇到從代碼調用并且必須模擬的情況GetAllResources,您可以執行以下操作:


var getAllResources=func(r ResourceManager) ([]*Resource,error) {

...

}

并將 getAllResources 分配給測試實例。


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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