第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Golang猴子補丁

Golang猴子補丁

Go
眼眸繁星 2022-01-10 14:19:33
我知道如果 go 代碼的結(jié)構(gòu)使得它被編程為接口,那么模擬是微不足道的;但是,我正在使用無法更改的代碼庫(那不是我的),但事實并非如此。這個代碼庫是高度互連的,沒有任何東西被編程到接口,只有結(jié)構(gòu),所以沒有依賴注入。結(jié)構(gòu)本身只包含其他結(jié)構(gòu),所以我也不能這樣模擬。我不相信我可以對方法做任何事情,而且存在的少數(shù)函數(shù)不是變量,所以我不知道將它們換掉。繼承在 golang 中不是一回事,所以這也是不行的。在像 python 這樣的腳本語言中,我們可以在運行時修改對象,也就是猴子補丁。我可以在 golang 中做一些類似的事情嗎?試圖找出某種方法來測試/基準(zhǔn)測試而不觸及底層代碼。
查看完整描述

3 回答

?
米脂

TA貢獻1836條經(jīng)驗 獲得超3個贊

當(dāng)我遇到這種情況時,我的方法是使用我自己的接口作為允許在測試中進行模擬的包裝器。例如。


type MyInterface interface {

    DoSomething(i int) error

    DoSomethingElse() ([]int, error)

}


type Concrete struct {

    client *somepackage.Client

}


func (c *Concrete) DoSomething(i int) error {

    return c.client.DoSomething(i)

}


func (c *Concrete) DoSomethingElse() ([]int, error) {

    return c.client.DoSomethingElse()

}

現(xiàn)在,您可以像模擬somepackage.Client接口一樣模擬 Concrete 。


正如@elithrar在下面的評論中指出的那樣,您可以嵌入您想要模擬的類型,因此您只需要添加需要模擬的方法。例如:


type Concrete struct {

    *somepackage.Client

}

這樣做后,DoSomethingNotNeedingMocking可以直接調(diào)用其他方法,Concrete而無需將其添加到接口/模擬出來。


查看完整回答
反對 回復(fù) 2022-01-10
?
慕標(biāo)琳琳

TA貢獻1830條經(jīng)驗 獲得超9個贊

Go有一個可用的猴子補丁庫。它僅適用于 Intel/AMD 系統(tǒng)(特別針對 OSX 和 Ubuntu)。


查看完整回答
反對 回復(fù) 2022-01-10
?
幕布斯7119047

TA貢獻1794條經(jīng)驗 獲得超8個贊

根據(jù)情況,您可以應(yīng)用“依賴倒置原則”并利用 Go 的隱式接口。


為此,您在包中定義您的需求接口以及使用情況(而不是定義您在實現(xiàn)它的包中提供的內(nèi)容;就像您在 Java 中一樣)。


然后,您可以獨立于依賴項來測試您的代碼。


具有結(jié)構(gòu)依賴的典型對象:


// Object that relies on a struct

type ObjectUnderTestBefore struct {

    db *sql.DB

}


func (o *ObjectUnderTestBefore) Delete() error {

    o.db.Exec("DELETE FROM sometable")

}

應(yīng)用依賴倒置原則(帶隱式接口)


// subset of sql.DB which defines our "requirements"

type dbExec interface {

    Exec(query string, args ...interface{}) (sql.Result, error)

}


// Same object with it's requirement defined as an local interface

type ObjectUnderTestWithDIP struct {

    // *sql.DB will implicitly implement this interface

    db dbExec

}


func (o *ObjectUnderTestWithDIP) Delete() error {

    o.db.Exec("DELETE FROM sometable")

}


查看完整回答
反對 回復(fù) 2022-01-10
  • 3 回答
  • 0 關(guān)注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號