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);
Здесь я приведу фиктивные значения.
РЕДАКТИРОВАТЬ: Обновлено, чтобы улучшить использование фиктивных объектов.