加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

unit-testing – 在golang中用于模拟第三方库的接口

发布时间:2020-12-16 09:29:10 所属栏目:大数据 来源:网络整理
导读:我正在尝试创建一个简单的模拟器,用于使用VMware vSphere API客户端( govmomi)对某些代码进行单元测试 – 但是我无法找到可用的模式. 客户端库的一个简单用例是检索vSphere集群的已安装许可证: vclient,err := govmomi.NewClient(*vcurl,true)if err != nil
我正在尝试创建一个简单的模拟器,用于使用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来模拟响应.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读