Как смоделировать производный класс, который вызывает его методы базового класса? - PullRequest
2 голосов
/ 25 июня 2019

Я выполняю модульное тестирование производного класса и хочу EXPECT_CALL, чтобы был вызван определенный метод, принадлежащий его базовому классу.

Например:

class Base {
public:
    void move(int x, int y);
};

class Derived: public Base{
public:
    RESULT update();

private:
    int age;
};

HRESULT Derived::update(void) {
    int param1 = 5, param2 = 10;
    move(param1, param2);
    age++;

    return SUCCESS;
}

Я не могупросто создайте макет для Derived и ожидайте move, так как нет никакой зависимости, и будет вызван фактический move ().

Как я могу иметь возможность смоделировать move()?Моя конечная цель заключается в том, чтобы я ожидал, что move () будет вызываться со значениями параметра CORRECT (в данном случае param1 and param2).

Конечно, это не фактический код, а просто представление

Я знаю, что это не очень хороший дизайн с точки зрения UT, но это для проверки некоего унаследованного кода, который мне не разрешено переформатировать (но нужно сделать UT).Поэтому возможность смоделировать и протестировать move () - лучший вариант, который у меня есть.

Помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

Я не думаю, что есть какой-либо способ без использования некоторых приемов предварительной обработки.И из тех приемов, которые делают метод виртуальным при тестировании, должно быть наименее болезненным.Достаточно сделать что-то вроде:

#if UNDER_TEST
#define TEST_VIRTUAL virtual
#else
#define TEST_VIRTUAL
#endif

class Base {
public:
    TEST_VIRTUAL void move(int x, int y);
};

Тогда вы можете сделать это так:

class TestObject : public Derived {
public:
    MOCK_METHOD2(move, void(int x, int y));
};

TEST(Test, Testing)
{
    TestObject obj;
    EXPECT_CALL(obj, move(5, 10));
    obj.update();
}
2 голосов
/ 25 июня 2019

В этом коде есть примечание, чтобы издеваться.У вас нет здесь никакой внешней зависимости.

Тест для этого кода может выглядеть следующим образом:

TEST(DerivedTest, WhenUpdateIsCalledPossitionIsChangedAndItGetsOlder)
{
    Derived foo;
    foo.age = 1;
    foo.update();
    EXPECT_EQ(10, foo.x);
    EXPECT_EQ(12, foo.y);
    EXPECT_EQ(2, foo.age);
}

Покажите мне причину, по которой здесь есть смысл что-то издеваться?

...