При написании юнит-тестов часто нужны фиктивные объекты. Чтобы сделать заменяемый объект proccution, класс фиктивного объекта происходит от класса производственного объекта и переопределяет некоторые виртуальные функции.
Проблема возникает, когда у производственного класса нет виртуальных функций, и вы не можете это изменить. Сейчас я вижу два варианта решения проблемы.
Превратите свой класс в шаблон класса, параметризованный типом подсистем. Ваш производственный класс будет
[/ NOEDIT] и для тестов на использование MyClass<ProductionSubsystem>
[/ NOEDIT]
MyClass<MockSubsystem>
Вручную напишите оболочку с виртуальной функцией, которая вызывает не виртуальные функции класса обернутой подсистемы. Тогда издевайтесь над оберткой.
Я не совсем доволен ни одним из двух вариантов. 1 вынуждает меня превратить мой «простой» класс в шаблон класса, а 2 вынуждает меня писать много кода для котла.
Поэтому мне было интересно, можно ли автоматизировать процесс написания оболочки для не виртуального класса. Я представляю что-то вроде этого:
// The subsystem that contains the production code
class Interface
{
void nonVirtualFunction();
}
// Contains the same functions as Interface but does not derive from it
class Implementation
{
void nonVirtualFunction();
};
// wrapper base class that provides the virtual interface
template<typename Interface>
class AutoWrapper
{
// Do some magic to provide the same functions that Interface has, but virtual.
}
// Class to provide the interface of AutoWrapper<Interface> but calls the functions in Implentation.
template<typename Implementation, template Interface>
class AutoWrapperImpl
{
// do some other magic here ...
};
Эта настройка должна разрешать следующий вариант использования:
// code using the AutoWrapper
void useAutoWrapper()
{
AutoWrapper<Interface> wrapper = new AutoWrapper<Interface>();
wrapper->nonVirtualFunction(); // calls Interface::nonVirtualFunction()
wrapper = new AutoWrapperImpl<Interface,Implementation>();
wrapper->nonVirtualFunction(); // calls Implementaion::nonVirtualFunction()
}
Возможно ли в C ++ реализовать два класса AutoWrapper и AutoWrapperImpl? Если это так, как это делается и есть ли общедоступное решение?
Задача ещё не решена.
Других решений пока нет …