unit-testing – 在golang中用于模拟第三方库的接口
我正在尝试创建一个简单的模拟器,用于使用VMware vSphere API客户端(
govmomi)对某些代码进行单元测试 – 但是我无法找到可用的模式.
客户端库的一个简单用例是检索vSphere集群的已安装许可证: vclient,err := govmomi.NewClient(*vcurl,true) if err != nil { return err } lic,err := vclient.LicenseManager().ListLicenses() NewClient()返回指向Client结构的指针,Client.LicenseManager()返回LicenseManager结构的实例,LicenseManager.ListLicenses()返回包含许可证信息的结构片.来自Python背景,我通常会在LicenseManger上修补ListLicenses()方法以获得模拟,但我似乎无法在Go中提出类似的模式或方法. 到目前为止,我已经尝试使用govmomi Client结构作为匿名成员创建一个包装器结构VCenterClient,并使用“构造函数”函数NewVCenter()来创建包含mocks逻辑的包装器结构的新实例: 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的接口.但是,我正在努力寻找替代方案. 在这种情况下,任何有关更好的设计模式或正确使用接口的帮助都将非常受欢迎. 解决方法
该库是SOAP客户端(
http://godoc.org/github.com/vmware/govmomi/vim25/soap#Client).摘要在HTTP层使用net / http / httptest(
http://golang.org/pkg/net/http/httptest/)或使用您自己的HTTPRoundtripper来模拟响应.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |