Могу ли я обойтись без насмешки над всеми методами в интерфейсе C ++ при использовании googlemock - PullRequest
3 голосов
/ 30 марта 2011

Я использую Google Mock 1.6 RC и пытаюсь смоделировать COM Interface.В интерфейсе COM имеется около 50 методов, некоторые из которых унаследованы от базовых интерфейсов.Когда я создаю макет struct, который наследует от этого интерфейса и макетирует только методы, которые я использую, я получаю ошибку cannot instantiate abstract class.

Я хочу знать, возможно ли это сделать в googlemock илинет.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2011

Вы должны переопределить каждый метод, который был объявлен как чисто виртуальный в классах, от которых вы наследуете, прямо или косвенно. Есть две причины не желать переопределять их все:

  1. Их слишком много, и у вас есть что-то лучшее, чем ваше время, чтобы обойти их все.
  2. Компиляция ложного класса со всеми из них происходит слишком медленно и занимает слишком много памяти.

Исправление для (1) заключается в использовании сценария gmock_gen.py в каталоге scripts Google Mock. Он просматривает определение класса и преобразует объявления методов в операторы MOCK_METHOD. Если у вас есть проблемы с (2), вы можете заменить ненужные операторы MOCK_METHOD заглушками:

MOCK_METHOD1(f, bool(int i));

с

virtual bool f(int i) {
  thrown std::exception("The stub for f(int) has been invoked unexpectedly.");
}

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

Редактировать: Если исходные интерфейсы для макета написаны с использованием макросов Microsoft, в этой теме размещен скрипт, который преобразует их в C ++, приемлемый для gmock_gen.py.

1 голос
/ 30 марта 2011

Это невозможно сделать. Вы должны перегрузить все чисто виртуальные методы из всех интерфейсов (кроме конструктора и деструктора).

0 голосов
/ 30 марта 2011

Я не совсем уверен, следует ли охватывать все методы в классе mock ... В примерах gmock вы можете видеть, что, например, деструкторы не являются mocked.Поэтому я полагаю, что нет необходимости макетировать весь класс.

В любом случае, разве вы не должны создавать фиктивный класс, а не фиктивную структуру?

Однако в скриптах есть инструмент gmock_gen.py/ генератор, который должен выполнять за вас тяжелую работу по издевательству над большими классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...