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

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

作為接口訪問的單例的單元測試

作為接口訪問的單例的單元測試

Go
慕容森 2022-06-01 11:08:17
我的應用程序中有一個單例,但它不是直接作為結構發布,而是作為接口發布(因為我希望能夠在單例初始化時動態選擇特定的實現)。這是代碼:var once sync.Oncevar instance defaultConfigurationtype Configuration interface {    GetFoo() string}type defaultConfiguration struct {}func (dc defaultConfiguration) GetFoo() string {    return "foo"}func NewConfiguration() Configuration {    once.Do(func() {        instance = defaultConfiguration{}    })    return instance}然后我決定編寫一個單元測試來檢查NewConfiguration()每次是否實際返回相同的實例:func TestNewConfigurationSameInstance(t *testing.T) {    configuration1 := NewConfiguration()    configuration2 := NewConfiguration()    if &configuration1 != &configuration2 {        t.Error()    }}我認為比較返回實例的地址是有意義的,但是,這個測試失敗了。然后我想,好吧,也許我必須返回一個指向實例的指針,所以我將代碼更改為如下所示:func NewConfiguration() *Configuration {    once.Do(func() {        instance = defaultConfiguration{}    })    return &instance}但這甚至無法編譯:它失敗并顯示錯誤消息不能使用 &instance (type *defaultConfiguration) 作為類型 *Configuration 在返回參數中: *Configuration 是指向接口的指針,而不是接口我很困惑。為什么我不能返回指向接口的指針?或者,為什么按原樣返回defaultConfiguration是Configuration有效的,但*defaultConfiguration按原樣返回*Configuration不是?畢竟,什么是適合我的用例的單元測試?
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

您的代碼應該是:


var once sync.Once

var instance *defaultConfiguration


type Configuration interface {

    GetFoo() string

}


type defaultConfiguration struct {

}


func (dc *defaultConfiguration) GetFoo() string {

    return "foo"

}


func NewConfiguration() Configuration {

    once.Do(func() {

        instance = &defaultConfiguration{}

    })

    return instance

}

因為Configuration是一個接口,你想要一個指針defaultConfiguration來實現它。


*Configuration很少需要指向接口的指針(例如)。一個接口已經是一個引用值,一個指向某種類型的指針來實現一個接口是完全沒問題的。


有關根本問題的更多背景信息,請閱讀此答案或類似資源。


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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