GMOCK как назначать значения аргументам функции

У меня есть функция, как показано ниже:

FnCall(request, response);

где тип запроса и ответа класса - Сообщение. Теперь я смоделировал метод, как показано ниже:

class MessageMock : public Message
{
public:
MOCK_METHOD2(FnCall, bool(const Message* request, Message*& response));
};

В моем тестовом случае у меня есть ожидающий вызов FnCall

EXPECT_CALL(mMessageMock, FnCall(::testing::_,::testing::_));

Мое требование состоит в том, чтобы установить некоторое фиктивное значение в аргументе запрос / ответ в функции FnCall типа MessageMock - как я могу установить это?

================================================== =====================

Я попробовал следующий код:

MessageMock MessageMock1, MessageMock2;

EXPECT_CALL(mMessageMock, FnCall(&mMessageMock1,
                &mMessageMock2));

Но получить ошибку компиляции и даже попытался с объявлением const:

error: no matching function for call to 'gmock_FnCall(MessageMock*, MessageMock*)'

note: candidate is:
note: testing::internal::MockSpec<bool(const Message*, Message*&)>& 

 note:   no known conversion for argument 2 from 'MessageMock*' to 'const testing::Matcher<Message*&>&'

1 ответ

Вы делаете это неправильно. Ваше ожидание только на mMessageMock так что просто этот объект должен быть ложным. (Вы ожидаете на фиктивном экземпляре), если тест является вызывающим:

mMessageMock.method(...)

Вы должны предоставить фиктивные объекты для этого вызова.

Допустим, у вас есть такой интерфейс:

class MyInterface{
    public:
        virtual void method(MyInterface*, MyInterface*) = 0;
}; 

и вы хотите проверить, какой метод вызывается на этом интерфейсе. Вы определяете класс макета и устанавливаете ожидание для этого экземпляра этого макета.

class MyMock : public MyInterface{
    public:
        MOCK_METHOD2(method, void(MyInterface*,MyInterface*);
};

Для вашего теста вам нужно предоставить объект Dummy для завершения интерфейса:

class MyDummy : public MyInterface{
    public:
        void method(MyInterface*, MyInterface*) override{}
};

Итак, в вашем тесте добавьте:

MyMock mock;
MyDummy request, response;
EXPECT_CALL(mock, method(&request, &response));

и если вы хотите проверить это без остальной части кода. Просто вызовите этот метод на фиктивном экземпляре после установки ожидания.

mock.method(&request,&response);

Здесь я приведу фиктивные значения.

РЕДАКТИРОВАТЬ: Обновлено, чтобы улучшить использование фиктивных объектов.

Другие вопросы по тегам