我正在阅读此页面(我没有在使用Amazon,只是在阅读Golang教育 class )
https://aws.amazon.com/blogs/developer/mocking-out-then-aws-sdk-for-go-for-unit-testing/
当我自己尝试时,出现类型错误。
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
我觉得我正在完全复制Amazon教程。怎么会有代码来代替ThirdPartyStruct来使用mockedReceiveMsgs?
最佳答案
问题不在于模拟,而在于队列结构按值(作为子结构)而不是指针包括ThirdPartyStruct。模拟的ReceiveMsgs也是如此。碰巧的是,在Queue结构中,可以通过客户端名称访问此子结构,而在mockedReceiveMsgs中,它是“匿名的”(但如果需要,实际上可以由ThirdPartyStruct名称引用)。
因此,q := Queue{Client: mockedReceiveMsgs{}}
实际上试图将mockedReceiveMsgs复制到Client中,并且由于包含多余的位(显然不适合ThirdPartyStruct)而显然失败。您可以通过将其更改为q := Queue{Client: mockedReceiveMsgs{}.ThirdPartyStruct}
进行编译,尽管我怀疑这是您想要的。
请注意,如果将Client ThirdPartyStruct
更改为Client interface{}
(在您的原始示例中),那么它将也进行编译。这很可能是您想要的。它也可以与任何接口类型一起使用。这是@tkausl最有可能指出的。实现接口时,唯一棘手的问题是指针语义与值语义。有时确实会回火。查看快速示例here