treg
Добрый день, не подскажите как решить следующую проблему:
есть класс который хочу протестировать с помощью google test:
class RawModelReceiver в классе используется класс ChunkManager с не виртуальными методами, поэтому что бы заменить его на мок класс делаю основной шаблоном. В итоге в заголовке
template<class T>
class RawModelReceiver
в cpp классе специализация RawModelReceiver<ChunkManager>::. Для тестов создал класс MockChunkManager и для него надо тоже сделать специализацию, копировать код или использовать какие-то скрипты не хотелось,
могу я как-то переопределить специализацию с ChunkManager на MockChunkManager только для тестов. В качестве системы сборки Cmake
У тебя есть
ChunkManager, который работает с недоступным устройством и
MockedChunkManager, который должен имитировать его логику.
Тебе надо иметь возможность подставлять в RawModelReceiver один или другой класс, в зависимости от тест/реальная работа.
Это можно сделать двумя путями:
- за счёт рантайм полиморфизма в ChunkManager - надо выделить общий интерфейс, и унаследовать оба ChunkManager-а от него, а RawModelReceiver будет работать только с интерфейсом.
- за счёт статического полифорфизма на шаблонах в RawModelReceiver и инстанциации его с ChunkManager, либо MockedChunkManager
В обоих случаях MockedChunkManager должен имитировать работу реального ChunkManager и у них может быть какой-то общий код, который будет повторяться.
С этим общим кодом можно бороться опять-таки теми двумя методами выше (одним из двух):
- за счёт рантайм полиморфизма
- за счёт статического полифорфизма на шаблонах
То есть либо надо опять выделять базовый класс из ChunkManager и учить его работать с абстрактным устройством, либо выделять общую часть в шаблонный класс, и инстанциировать
его с одним или другим устройством.
При этом пока именно специализация классов-шаблонов тут не нужна, ну не видно совсем зачем бы это было нужно.