我试图创建单元测试使用的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
类型的接口。不过,我正在努力寻找替代品。
上一个更好的设计图案或正确使用在这种情况下接口的任何帮助,将不胜感激。