我正在阅读此页面(我没有在使用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

09-26 14:47