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

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

當(dāng)一個具體方法的簽名引用另一個具體類型而不是它的接口時,如何模擬多個類型?

當(dāng)一個具體方法的簽名引用另一個具體類型而不是它的接口時,如何模擬多個類型?

Go
哈士奇WWW 2021-11-22 15:43:43
我正在使用一個第三方庫,它的類沒有任何接口。我可以在我的結(jié)構(gòu)中使用它們沒問題,但它們有副作用,我想在單元測試時避免這些副作用。// Somewhere there are a couple structs, with no interfaces. I don't own the code.// Each has only one method.type ThirdPartyEntry struct {}func (e ThirdPartyEntry) Resolve() string {    // Do some complex stuff with side effects    return "I'm me!"}// This struct returns an instance of the other one.type ThirdPartyFetcher struct {}func (f ThirdPartyFetcher) FetchEntry() ThirdPartyEntry {    // Do some complex stuff with side effects and return an entry    return ThirdPartyEntry{}}// Now my code.type AwesomeThing interface {    BeAwesome() string}// I have a class that makes use of the third party.type Awesome struct {    F ThirdPartyFetcher}func (a Awesome) BeAwesome() string {    return strings.Repeat(a.F.FetchEntry().Resolve(), 3)}func NewAwesome(fetcher ThirdPartyFetcher) Awesome {    return Awesome{        F: fetcher,    }}func main() {    myAwesome := NewAwesome(ThirdPartyFetcher{})    log.Println(myAwesome.BeAwesome())}這有效!但是我想寫一些單元測試,所以我想模擬這兩個第三方結(jié)構(gòu)。為此,我相信我需要它們的接口,但由于 ThirdPartyFetcher 返回 ThirdPartyEntrys,我無法弄清楚如何。我創(chuàng)建了一對與兩個第三方類匹配的接口。然后我想重寫 Awesome 結(jié)構(gòu)和方法以使用通用 Fetcher 接口。在我的測試中,我會調(diào)用 NewAwesome() 傳入一個 testFetcher,一個也實現(xiàn)接口的結(jié)構(gòu)。type Awesome struct {    F Fetcher}func NewAwesome(fetcher Fetcher) Awesome {    return Awesome{        Fetcher: fetcher,    }}type Entry interface {    Resolve() string}// Double check ThirdPartyEntry implements Entryvar _ Entry = (*ThirdPartyEntry)(nil)type Fetcher interface {    FetchEntry() Entry}// Double check ThirdPartyFetcher implements Fetchervar _ Fetcher = (*ThirdPartyFetcher)(nil)簽名是不同的,即使我已經(jīng)展示了 ThirdPartyEntry 實現(xiàn)了 Entry。我相信這是不允許的,因為 to 會導(dǎo)致切片之類的東西(在多態(tài)意義上,而不是 golang 意義上)。有沒有辦法讓我寫一對接口?應(yīng)該是這樣的情況,Awesome 類甚至不知道 ThirdParty 存在——它被抽象在接口后面,并在 main 調(diào)用 NewAwesome 時注入。
查看完整描述

1 回答

?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗 獲得超11個贊

它不是很漂亮,但一種方法是:


type fetcherWrapper struct {

    ThirdPartyFetcher

}


func (fw fetcherWrapper) FetchEntry() Entry {

    return fw.ThirdPartyFetcher.FetchEntry()

}

我會說嘲笑返回結(jié)構(gòu)與接口的東西是一個相對常見的問題,除了很多中間包裝之外沒有任何很好的解決方案。


查看完整回答
反對 回復(fù) 2021-11-22
  • 1 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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