Это очень плохая идея - смоделировать / подделать часть класса для проверки другого.
Делая это, вы не тестируете, что делает реальный код в тестируемых условиях, что приводит к ненадежным результатам теста.
Это также увеличивает бремя обслуживания поддельной части класса.Если это действует для всей тестовой программы, реализация фальшивок также усложняет другие тесты фальсифицированного метода.
Вам нужно спросить себя, зачем вам нужно подделывать тестируемую деталь.
Если это происходит потому, что метод обращается к файлу или базе данных, вы должны определить интерфейс и передать экземпляр этого интерфейса конструктору или методу класса.Это позволяет вам тестировать различные сценарии в одном и том же тестовом приложении.
Если это происходит из-за того, что вы используете синглтоны, вам следует переосмыслить свой дизайн, чтобы сделать его более тестируемым: удаление синглетонов удалит неявные зависимости и кошмары обслуживания.
Если вы используете статические методы / автономные функции для доступа к данным в реестре или файле настроек, вам действительно следует удалить их из тестируемой функции и передать данные в качестве параметра или предоставить интерфейс поставщика настроек,Это сделает код более гибким и надежным.
Если вы хотите сломать зависимость для целей тестирования (например, подделка векторного метода для тестирования метода в матричном классе), то вы не должны притворятьсяэто - вы должны рассматривать тестируемый код как то, что определяется тестируемым классом его открытым интерфейсом: методы;предварительные условия, постусловия, инварианты, документация, параметры и спецификации исключений.
Вы можете использовать знания деталей реализации для тестирования особых крайних случаев, но запускать их через основной API, а не подделывать реализациюdetail.
Например, предположим, что вы фальсифицировали std :: vector :: at (), но реализация переключилась на использование оператора [].Ваш тест будет сломан или тихо пройден.