首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在golang中用于模拟第三方库接口

在golang中用于模拟第三方库接口
EN

Stack Overflow用户
提问于 2015-02-10 04:11:59
回答 1查看 1.2K关注 0票数 5

我正在尝试创建一个简单的模拟,用于使用VMware vSphere API客户端- govmomi -对一些代码进行单元测试,但我在寻找可用的模式时遇到了麻烦。

客户端库的一个简单使用案例是检索vSphere群集的已安装许可证:

代码语言:javascript
复制
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中提出类似的模式或方法。

到目前为止,我已经尝试创建了一个包装器结构VCenterClient,将govmomi Client结构作为匿名成员,并使用“构造函数”函数NewVCenter()来创建具有模拟逻辑的包装器结构的新实例:

代码语言:javascript
复制
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}
}

...but我在使用接口正确抽象govmomi库中的嵌套结构时遇到了问题。我知道上面的方法不起作用,因为govmomi.LicenseManager()返回类型为govmomi.LicenseManager的结构,而我的VCenterClientInterface.LicenseManager()方法返回类型为LicenseManager的接口。然而,我正在努力寻找替代方案。

在这种情况下,任何关于更好的设计模式或接口的正确使用的帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-02-10 04:34:08

这个库是一个SOAP客户端(http://godoc.org/github.com/vmware/govmomi/vim25/soap#Client)。使用net/ HTTP /httptest (http://golang.org/pkg/net/http/httptest/)在HTTP层进行抽象,或者使用您自己的HTTPRoundtripper模拟响应。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28418430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档