Unit testing 如何在Golang中模拟struct方法
我在读这个页面,我没有使用亚马逊,只是在为golang education阅读 当我自己尝试时,我会得到类型错误Unit testing 如何在Golang中模拟struct方法,unit-testing,go,mocking,Unit Testing,Go,Mocking,我在读这个页面,我没有使用亚马逊,只是在为golang education阅读 当我自己尝试时,我会得到类型错误 type Queue struct { Client ThirdPartyStruct URL string } type mockedReceiveMsgs struct { ThirdPartyStruct Resp ValueIWantToMock } q := Queue{Client: mockedReceiveMsgs{}} 当
type Queue struct {
Client ThirdPartyStruct
URL string
}
type mockedReceiveMsgs struct {
ThirdPartyStruct
Resp ValueIWantToMock
}
q := Queue{Client: mockedReceiveMsgs{}}
当我尝试做完全相同的事情时,我会
cannot use mocked literal (type mockedReceiveMsgs) as type ThirdPartyStruct in field value
我觉得我完全是在复制亚马逊教程。为什么在代码中,mockedReceiveMsgs可以用来代替ThirdPartyStruct?问题不在于mocking,而在于队列结构将ThirdPartyStruct by value作为子结构,而不是指针。MockedReceiveMsg也是如此。恰好在队列结构中,这个子结构可以通过客户端名称访问,而在mockedReceiveMsgs中,它被认为是匿名的,但如果需要,实际上可以通过第三方结构名称引用 所以,q:=队列{Client:mockedReceiveMsgs{}}实际上试图将mockedReceiveMsgs复制到客户机中,但显然失败了,因为它有额外的位,这些位不适合第三方结构。您可以通过将其更改为q:=队列{Client:mockedReceiveMsgs{}.ThirdPartyStruct}来编译它,尽管我怀疑这是您想要的 请注意,如果在原始示例中将客户机第三方结构更改为客户机接口{},那么它也将编译。这很可能就是你想要的。它还可以与任何接口类型一起工作。这是@tkausl最有可能指出的。在实现接口时,唯一棘手的一点是指针语义与值语义。它有时会还击。请看一个快速示例如果ThirdPartyStruct,顾名思义,是一种结构类型,而不是接口类型,那么您不能模拟它,这在Go中是不可能的。如果仔细阅读示例文章并遵循SQSAPI的说明,您会发现它是一种接口类型 类型SQSAPIinterface{
要使代码具有可模仿性,您需要为客户端字段使用接口类型。以下是一个更符合aws的示例:您使用的是结构,aws使用的是接口。后续:如何模拟ThirdPartyStruct的方法?假设我只允许接触测试,因此无法通过将当前代码包装到RealHirdPartyStruct。