Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在Golang中模拟struct方法_Unit Testing_Go_Mocking - Fatal编程技术网

Unit testing 如何在Golang中模拟struct方法

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{}} 当

我在读这个页面,我没有使用亚马逊,只是在为golang education阅读

当我自己尝试时,我会得到类型错误

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。