Как настроить пользовательскую переменную ref в gmock

Я использую gmock в своем проекте, и я встречаю проблему, чтобы установить настраиваемую ссылочную переменную для функции mock. Предположим, что у меня есть класс следующим образом:

class XXXClient {
public:
    void QueryXXX(const Request&, Response&);
}; 

class XXXRunner {
public:
    void DoSomething(XXXClient&);
};

Существует класс клиента XXXRunner:: DoSomething с использованием XXXClient:: QueryXXX, и я хочу высмеять XXXClient для проверки XXXRunner:: DoSomething.

Проблема заключается в том, что второй параметр QueryXXX, то есть "Response", не является возвращаемым значением, а ссылочной переменной, которую я заполняю некоторыми данными в Response в XXXClient:: QueryXXX. Я хочу установить пользовательские данные для ответа, чтобы проверить другое условие XXXRunner:: DoSomething.

Структура gmock может устанавливать ожидаемое возвращаемое значение, но я не могу найти способ установить "возвращенную переменную"?

Итак, как это сделать?

Ответ 1

Сначала создайте класс XXXClient mock, назовите его XXXClientMock следующим образом:

class XXXClientMock : public XXXClient
{
public:
    MOCK_METHOD2(QueryXXX, QueryResult (Request&, Response&));
};

Затем используйте GMock Action 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 для вызова пользовательской функции макета (с простой тестовой логикой), вы можете увидеть здесь для более подробной информации.

Наслаждайся:) Спасибо вам

Ответ 2

Проверьте SetArgReferee в обходном листе Google Mock .