GoogleMock:如何根据另一个输入参数设置ArgReferee?

GoogleMock: How to SetArgReferee according to another input parameter?

我想使用 GoogleMock 模拟如下服务:

class Request
{
    int req_id;
    int request;
};

class Response
{
    int req_id;
    int response;
};

int request(Response& res, const Request& req)
{
    res.req_id = req.req_id;
    res.response = 2 * req.request;

    return 1;
}

EXPECT_CALL(mock_service, request(_,_)).WillOnce(DoAll(SetArgReferee<0>(/* what here? */), Return(1)));

如何根据传入的 const Request& req,即 res.req_id = req.req_id;res.response = 2 * req.request;SetArgReferee 得到 Response& res

您的代码看起来不像是可以被嘲笑的东西 - 但我想这只是问题的例证。

所以假设你在模拟 class MockService 中模拟了函数 reqest - 然后使用 Invoke Action 和你的 request 函数作为参数:

EXPECT_CALL(mock_service, request(_,_)).WillOnce(Invoke(&request));

如果您只想调用基础 class 函数 - 那么请执行以下操作:

class mock_service_class : public service_class
{
public:
    MOCK_METHOD2(request, int(Response& res, const Request& req));
    int baseRequest(Response& res, const Request& req)
    {
        return service_class::request(res, req);
    }
};

然后 EXPECT_CALL 这样做:

EXPECT_CALL(mock_service, request(_,_))
    .WillOnce(Invoke(&mock_servide, 
                     &mock_service_class::baseRequest));