2017-07-26 3 views
1

Je voudrais utiliser GoogleMock pour se moquer d'un service comme ci-dessous:GoogleMock: Comment définirArGReferee en fonction d'un autre paramètre d'entrée?

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

Comment puis-je SetArgReferee pour le Response& res selon le passé dans const Request& req, à savoir res.req_id = req.req_id; et res.response = 2 * req.request;?

+0

Peut-être que [this] (https://stackoverflow.com/a/8987602/1129815) peut vous aider. – Steeve

Répondre

1

Votre code ne ressemble pas à quelque chose qui pourrait être moqué - mais je suppose que c'est juste une illustration du problème.

Donc, en supposant que vous avez la fonction moqué reqest au sein MockService de classe moqué - puis utilisez Invoke Action avec votre fonction request en tant que paramètre:

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

Si vous aimez appeler simplement la fonction de la classe de base - faire quelque chose comme ceci:

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

Et faire votre EXPECT_CALL de cette façon:

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