Для того, что я видел в документации, ему фактически не нужен фиктивный объект для реализации какого-либо интерфейса. Поддельный объект создается на основе интерфейса исходного объекта, но не по наследству, а как параметр класса:
TMockObject<IInterface> mock;
Здесь нет наследования, и TMockObject не привязывается ни к какому интерфейсу посредством наследования. Затем добавляем имитирующие методы, которые будут реализованы имитирующим объектом:
mock.Method(&IInterface::SimpleFunction);
mock.Method(&IInterface::SimpleFunctionWithAlotParams);
((IInterface*)mock)->SimpleFunction();
((IInterface*)mock)->SimpleFunctionWithAlotParams(0, 0, 0, 0, std::string());
Опять же, объект mock
фактически не наследует интерфейс. Он может переопределить оператор преобразования в IInterface*
(он вернет внутренний IInterface
объект).
Я не вижу много преимуществ в не наследовании интерфейса, но в любом случае. Я бы предпочел некоторый шаблон в качестве функции-члена TMockObject
, чтобы придать большее значение этому уродливому приведению (не проверено, просто идея):
template <typename I>
I* as(void)
{
return m.internal_interface_pointer_;
}
чтобы вы могли написать что-то вроде:
mock.as<IInterface>()->SimpleFunction();
но все же ...