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

标签 c++ unit-testing googlemock

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

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

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

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

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

error C2440: 'return' : cannot convert from 'void' to '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 .

最佳答案

你的行为不是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)));

关于c++ - 为什么我不能将 SetArgPointee() 与 googlemock 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18363008/

相关文章:

C++ 从 std::multimap 中找到多个键

c++ - 如何在构造函数中初始化对象数组?

java - 如何在执行junit时模拟某个方法?

c++ - 我正在尝试从 GMocked 类返回一个 rapidjson::Value 但我似乎无法让它工作

c++ - C++基础程序抛出的错误

c++ - 英特尔 TBB 和微软 PPL 有什么区别?

c++ - 如果预期调用过度饱和,谷歌测试/模拟测试失败

unit-testing - GMock : Capture a reference argument in a mocked function

javascript - 在 AngularJS 中模拟 Controller 单元测试的依赖服务

java - 如何测试到期条件?