как установить custom ref-variable в gmock
Я использую gmock в своем проекте, и я сталкиваюсь с проблемой установки пользовательской ссылочной переменной для макетной функции. Предположим, у меня есть класс:
class XXXClient {
public:
void QueryXXX(const Request&, Response&);
};
class XXXRunner {
public:
void DoSomething(XXXClient&);
};
есть класс Client XXXRunner::сделать используя XXXClient::QueryXXX, и я хочу, чтобы поглумиться XXXClient чтобы проверить XXXRunner::сделать.
проблема заключается в том, что второй параметр QueryXXX ,то есть "Response", не является возвращаемым значением, а ссылочной переменной, в которую я заполняю некоторые данные Ответ в XXXClient:: QueryXXX. Я хочу установить пользовательские данные для ответа, чтобы проверить другое состояние XXXRunner:: DoSomething.
платформа gmock может установить ожидаемое возвращаемое значение, но я не могу найти способ установить "возвращаемую переменную" ?
Итак, как это сделать?
2 ответов
во-первых, сделать XXXClient
макет класса, давайте назовем его XXXClientMock
следующим образом:
class XXXClientMock : public XXXClient
{
public:
MOCK_METHOD2(QueryXXX, QueryResult (Request&, Response&));
};
затем используйте действие GMock SetArgReferee
чтобы установить пользовательский параметр, как показано ниже:
TEST(XXXRunnerTC, SetArgRefereeDemo)
{
XXXCLientMock oMock;
// set the custom response object
Response oRsp;
oRsp.attr1 = “…”;
oRsp.attr2 = “any thing you like”;
// associate the oRsp with mock object QueryXXX function
EXPECT_CALL(oMock, QueryXXX(_, _)).
WillOnce(SetArgReferee<1>(oRsp));
// OK all done
// call QueryXXX
XXXRunner oRunner;
QueryResult oRst = oRunner.DoSomething(oMock);
…
// use assertions to verity your expectation
EXPECT_EQ(“abcdefg”, oRst.attr1);
……
}
резюме
GMock предоставляет ряд действий, чтобы сделать его удобным для макетов функций, таких как SetArgReferee
для справки или значения SetArgPointee
для указателя, Return
для возврата, Invoke
for invoke custom mock function (с простой логикой тестирования), вы можете увидеть здесь для получения более подробной информации.
наслаждайтесь :) Спасибо