модульное тестирование. Можно ли написать шаблон класса c ++, который автоматически переносит и виртуализирует не виртуальные интерфейсы?

Эта проблема

При написании юнит-тестов часто нужны фиктивные объекты. Чтобы сделать заменяемый объект proccution, класс фиктивного объекта происходит от класса производственного объекта и переопределяет некоторые виртуальные функции.

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

  1. Превратите свой класс в шаблон класса, параметризованный типом подсистем. Ваш производственный класс будет MyClass<ProductionSubsystem>[/ NOEDIT] и для тестов на использование MyClass<MockSubsystem>[/ NOEDIT]

  2. Вручную напишите оболочку с виртуальной функцией, которая вызывает не виртуальные функции класса обернутой подсистемы. Тогда издевайтесь над оберткой.

Я не совсем доволен ни одним из двух вариантов. 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? Если это так, как это делается и есть ли общедоступное решение?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]