我試圖創建單元測試使用的VMware vSphere API客戶端的一些代碼的簡單模擬 - govmomi - 但我無法找到一個可用的模式。接口在golang使用嘲諷第三方庫
一個簡單的例子爲客戶端庫將是檢索在vSphere簇安裝的許可證:
vclient, err := govmomi.NewClient(*vcurl, true)
if err != nil {
return err
}
lic, err := vclient.LicenseManager().ListLicenses()
NewClient()
指針返回到客戶端的結構,Client.LicenseManager()
返回LicenseManager有結構的一個實例,並LicenseManager.ListLicenses()
返回包含許可證信息的結構片。從Python背景來看,我通常會在LicenseManger
上對ListLicenses()
方法進行猴子補丁模擬,但我似乎無法在Go中提出類似的模式或方法。
對於這一點,我已經試過與govmomi Client
結構中產生的包裝結構VCenterClient
作爲一個匿名成員和「構造」功能NewVCenter()
爲嘲笑創建邏輯封裝結構的新實例:
import (
"net/url"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/vim25/types"
)
type VCenterClient struct {
VCenterClientInterface
}
type VCenterClientInterface interface {
LicenseManager() LicenseManager
}
type LicenseManager interface {
ListLicenses() ([]types.LicenseManagerLicenseInfo, error)
}
type VCenterClientMock struct{}
type LicenseManagerMock struct{}
func (v *VCenterClientMock) LicenseManager() LicenseManager {
return LicenseManagerMock{}
}
func (l LicenseManagerMock) ListLicenses() ([]types.LicenseManagerLicenseInfo, error) {
return make([]types.LicenseManagerLicenseInfo, 0), nil
}
func NewVCenterClient(uri string, mock bool) *VCenterClient {
if mock {
return &VCenterClient{&VCenterClientMock{}}
}
vcurl, _ := url.Parse(uri)
vclient, _ := govmomi.NewClient(*vcurl, true)
return &VCenterClient{vclient}
}
...但有使用接口正確抽象嵌套結構中govmomi庫的麻煩我。我知道上面將無法正常工作govmomi.LicenseManager()
返回govmomi.LicenseManager
型的結構,我VCenterClientInterface.LicenseManager()
方法返回LicenseManager
類型的接口。不過,我正在努力尋找替代品。
上一個更好的設計圖案或正確使用在這種情況下接口的任何幫助,將不勝感激。