Как вызвать метод для объекта, переданного в издевательский метод
Я совершенно новичок в способе работы gmock.
У меня есть макет с методом addEvent, который берет объект типа MyClass по указателю. Мне нужно вызвать MyClass:: makeCall на этом объекте.
class SchedulerMock
{
public:
MOCK_CONST_METHOD1(addEvent, void(MyClass*));
};
Я нашел эту тему: Какой самый простой способ вызвать функцию-член на аргументе, переданном издевательской функции?
А там Пример:
IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
.WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));
Но я не хочу вызывать метод на объекте, который я создал в тесте. Я хочу макет для вызова совершение вызова на объект, который фактически передается в макет. Таким образом, я могу ввести свой макет в другой класс, который создаст некоторые новые объекты, и вызвать addEvent на моем schedulerMock, и я хотел бы, чтобы этот макет вызывал makeCall на переданном аргументе каждый раз, когда кто-то вызывает addEvent на моем макете. Надеюсь, я ясно выразился.
Возможно ли это сделать?
2 ответа:
Можно использовать другую функцию, которая вызывает функцию mock...
class SchedulerMock { public: //.... etc void addEvent(MyClass* c) const { c->makeCall(); mockAddEvent(c); //Wholla, test still works and makeCall called. } MOCK_CONST_METHOD1(mockAddEvent, void(MyClass*)); };
Вы можете определить пользовательское действие (в области пространства имен-вне любых других функций, тестов и т. д.). Действие будет иметь доступ к аргументам вызова издевательской функции, которая в данном случае является
MyClass *
, которую вы хотите вызватьmakeCall
на:ACTION(MakeCall) { // arg0 is predefined as 0-th argument passed to the mock function call, // MyClass* in this case arg0->makeCall(); } TEST(...) { // Create mock object and set expectation, and specify to invoke the // MakeCall Action SchedulerMock mock; EXPECT_CALL(mock, addEvent(_)) .WillOnce(MakeCall()); ... }
При вызове
mock.addEvent(my_class_ptr)
ДействиеMakeCall
будет вызвано с помощью данного указателяMyClass *
.Это также можно использовать для передачи в действие параметров, определенных в тесте. Например, если ваш метод
MyClass::makeCall
принимает параметрint
, допустим, и вы хотите передать два разных значения в первый и во второй раз, когда вызывается метод:class MyClass { void makeCall(int); }; ACTION_P(MakeCall, value) { arg0->makeCall(value); } TEST(...) { const int FIRST_VAL = 10; const int SECOND_VAL = 20; MyClass my_class_obj; SchedulerMock mock; EXPECT_CALL(mock, addEvent(_)) .WillOnce(MakeCall(FIRST_VAL)) .WillOnce(MakeCall(SECOND_VAL)); ... }
Смотрите документацию Google mock для получения более подробной информации: