2015-02-09 74 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类型的接口。不过,我正在努力寻找替代品。

上一个更好的设计图案或正确使用在这种情况下接口的任何帮助,将不胜感激。

回答