Избегайте звонков в базовый класс с помощью Google Mock - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь издеваться над классом, предоставленным библиотекой.У класса есть очень дорогой конструктор (для его запуска ~ 30 секунд), который я бы хотел избежать.Ни одна из реальных функциональных возможностей класса не должна работать, мне нужен только фиктивный объект, который я могу использовать, чтобы увидеть, были ли вызваны правильные методы.

class MockClass : public BaseClass
{
  public:
    MockClass();

    MOCK_CONST_METHOD1(methodA, void(const typeA a));
    MOCK_CONST_METHOD1(methodB, void(int b));
    MOCK_CONST_METHOD3(methodC, bool(double c, double d, int e));
};

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

Как мне обойти это?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Для создания MockClass объекта - в любом случае должен быть вызван один из BaseClass конструкторов.

Если BaseClass имеет другой (определяемый пользователем) конструктор, который приемлем для ложного сценария - вызовите его явно:

class MockClass : public BaseClass
{
  public:
    MockClass() : BaseClass(/* c-tor args */) {}

    // ...
};

Если такого конструктора нет - вам нужно будет добавить его (может сделать его защищенным, чтобы он не был доступен в обычном BaseClass контексте использования). [ edit : поскольку это библиотечный класс - добавление конструктора, скорее всего, не вариант]

Другое возможное направление - ввести чистый интерфейсный класс для BaseClass и смоделировать его вместо насмешки BaseClass напрямую. В этом случае использование BaseClass должно быть переключено на использование нового интерфейса, а реализация интерфейса обернет BaseClass и перенаправит вызов необходимых методов во внутренний объект BaseClass. Таким образом, дополнительные BaseClass конструкторы для тестирования не нужно добавлять.

0 голосов
/ 21 мая 2019

Я закончил шаблонизировать тестируемый класс, как описано здесь .Использование одного экземпляра шаблона для тестов и одного для производства.

template <class Class>
class ClassToBeTested
{
  public:
    method(std::shared_ptr<Class> foo)
    {
        foo->do_something();
    }
}

Затем в тесте:

TEST(test_case, test_name)
{
    ClassToBeTested<MockClass> bar;
}

И в производственном коде:

int main(int argc, char *argv[])
{
    ClassToBeTested<BaseClass> bar;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...