Создать универсальную фабрику классов для тестирования создания / уничтожения динамических классов в GoogleTest?

Я столкнулся с некоторой загадкой, когда играл с Google Test.

Я хочу провести модульное тестирование класса C ++, основанного на событиях из внешней системы, который будет порождать новые классы для общения с объектами, которые приходят и уходят в системе. Диспетчер событий и способ создания классов для специализированных объектов решаются библиотеками, которые я не могу ни контролировать, ни изменять. Проект библиотеки требует, чтобы я передал конструктору класса определенные параметры о том, как соединиться с сущностью, и, если эта сущность не существует, конструктор выбросит.
Поскольку эти классы будут использоваться в зависимости от их существования и событий, я хочу иметь возможность EXPECT_CALL() на их методы. Очевидно, мне нужна фабрика для этого, чтобы я мог Mock или иным образом перегружать и возвращать классы Mock вместо реальных.

Я уже абстрагировал монитор событий в IClass, чтобы я мог создать его макет и управлять событиями контролируемым образом. Я создал фабрику с серией методов Construct [x], где каждый метод возвращает std::shared_ptr для нового экземпляра конкретного IClass. Это отлично работает, и я могу запустить полный набор тестов для класса, который я хочу тестировать таким образом. В том числе правильное уничтожение классов.

Однако я бы хотел, чтобы моя фабрика была более универсальной, и лучшее, что я могу придумать, это:

class ClassFactory {
public:
template<class U, class... Args>
std::shared_ptr<U> Construct(Args&&... args) {
return std::make_shared<U>(std::forward<Args>((args)...));
}
};

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

Итак, мой вопрос: возможно ли вообще создать для этого универсальную фабрику? И если это так, как бы я это сделал?

Заранее спасибо за помощь!

0

Решение

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

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

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

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