为什么我不能将SetArgPointee()与googlemock一起使用?

时间:2013-08-21 16:33:53

标签: c++ unit-testing googlemock

我正在尝试使用SetArgPointee在模拟上设置“out”参数。这是我正在测试的代码:

DWORD bodysize = 1024;
char body[1024];
HRESULT hr = req->ReadEntityBody(body, bodysize, false, &bodysize, NULL);

reqIHttpRequest*,我想在模拟中设置bodysize,参数3。这是我单元测试的代码:

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _))
    .WillOnce(SetArgPointee<3>(4))
    .WillOnce(Return(ERROR_HANDLE_EOF));

这会导致以下奇怪的错误:

  

错误C2440:'return':无法从'void'转换为'long'(gmock / gmock-actions.h:369)

如果我注释掉.WillOnce(SetArgPointee<3>(4)),代码会正确编译并执行。这是模拟本身的相关定义:

MOCK_METHOD5(ReadEntityBody, HRESULT(VOID *pvBuffer, DWORD cbBuffer, BOOL fAsync, DWORD *pcbBytesReceived, BOOL *pfCompletionPending));

如果有帮助,我的full mock of IHttpRequest

1 个答案:

答案 0 :(得分:11)

您的行为不是combined properly。因此,您的EXPECT_CALL声明缺少Return,这就是您收到有关尝试将void转换为long的错误的原因。确保您使用的是DoAll()

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _))
    .WillOnce(DoAll(SetArgPointee<3>(4), Return(ERROR_HANDLE_EOF)));