как установить пользовательскую ref-переменную в gmock - PullRequest
11 голосов
/ 13 января 2012

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

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 может устанавливать ожидаемое возвращаемое значение, но я не могу найти способ установить "возвращаемую переменную"?

Так как это сделать?

Ответы [ 2 ]

17 голосов
/ 24 января 2012

Сначала создайте макет класса XXXClient, назовем его 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 голосов
/ 13 января 2012

Ознакомьтесь с SetArgReferee в Google Mock шпаргалке .

...