Go语言 如何使用stretchr/testi模拟类字段?

xpcnnkqh  于 2023-02-06  发布在  Go
关注(0)|答案(1)|浏览(97)

我正在使用https://github.com/stretchr/testify go库来模拟类。我想为aws sdk包模拟一个类的字段:github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi.
我的密码是:

func publishData(ctx context.Context, api *apigatewaymanagementapi.Client) {

   ...
   api.PostToConnection(...)
}

我需要模拟PostToConnection方法。我设置模拟如下:

type MockApi struct {
    apigatewaymanagementapi.Client
    mock.Mock
}

func (m *MockApi) PostToConnection() (*apigatewaymanagementapi.PostToConnectionOutput, error) {
    m.Called()
    return nil, nil
}

在我的测试案例中,

api := MockApi{}
api.On("PostToConnection").Return(nil, nil)

模拟不起作用,代码仍然使用真正的Client。我认为问题是模拟只模拟根级别的方法,而不是Client.PostToConnection方法。
如何在Client下模拟该方法?

x8diyxa7

x8diyxa71#

用你自己的接口替换 * apigatewaymanagementapi.client,对于这个接口,在测试中,你可以自己写一个实现(stub)或者使用一个库来生成它(比如https://github.com/golang/mock)。
示例:

type (
    PublisherClient interface {
        PostToConnection(ctx context.Context, someArgs ... interface{})
    }
)

func publishData(ctx context.Context, api PublisherClient) {
    api.PostToConnection(ctx)
}
type (
    PublisherClientMock struct {
        Args []interface{}
    }
)

func (c PublisherClientMock) PostToConnection(ctx context.Context, someArgs ... interface{}) {
    c.Args = someArgs
}

相关问题