【问题标题】:Why can't I use SetArgPointee() with googlemock?为什么我不能将 SetArgPointee() 与 googlemock 一起使用?
【发布时间】:2013-08-24 03:42:29
【问题描述】:

我正在尝试使用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));

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

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

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

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

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

【问题讨论】:

    标签: c++ unit-testing googlemock


    【解决方案1】:

    您的操作不是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)));
    

    【讨论】:

    • 我之前明显不懂action,呵呵。感谢您的帮助!
    猜你喜欢
    • 2020-08-26
    • 2013-07-02
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2011-06-05
    • 2013-08-15
    相关资源
    最近更新 更多