1

I would like to use GoogleMock to mock a service as below:

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)));

How can I SetArgReferee for the Response& res according to the passed in const Request& req, i.e. res.req_id = req.req_id; and res.response = 2 * req.request; ?

duong_dajgja
  • 4,196
  • 1
  • 38
  • 65

1 Answers1

1

Your code does not look like something that could be mocked - but I guess this is just illustration of the problem.

So assuming that you have mocked function reqest within mocked class MockService - then use Invoke Action with your request function as parameter:

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

If you like to just call base class function - then do something like this:

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);
    }
};

And do your EXPECT_CALL in this way:

EXPECT_CALL(mock_service, request(_,_))
    .WillOnce(Invoke(&mock_servide, 
                     &mock_service_class::baseRequest));
PiotrNycz
  • 23,099
  • 7
  • 66
  • 112