2015-02-09 31 views
5

我試圖創建單元測試使用的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類型的接口。不過,我正在努力尋找替代品。

上一個更好的設計圖案或正確使用在這種情況下接口的任何幫助,將不勝感激。

回答