Как вызвать метод для объекта, переданного в издевательский метод


Я совершенно новичок в способе работы 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 4

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 для получения более подробной информации:

Google Макет Шпаргалки-Определение Действий

Google Mock Cookbook-Быстрое Написание Новых Действий