Если спецификация функции Hook::injectProcess
должна использовать предоставленный пользователем экземпляр IInjector
для внедрения DLL, любая реализация injectProcess
, которая не вызывает метод injectDLL
для этого предоставленного пользователем экземпляра, несомненно сломана. Таким образом, в приведенном вами примере, похоже, нет никакого нарушения инкапсуляции.
Пример, который вы демонстрируете, является хорошим примером внедрения зависимостей, идеально подходящего для тестирования с такими фреймворками, как Google Test. Он позволяет смоделировать некоторые конкретные операции, которые формализованы в открытых интерфейсах, путем вызова открытых функций с помощью создаваемых пользователем фиктивных объектов.
Однако в общем случае подобный код может нарушить инкапсуляцию. Считайте, что тестируемая функция не является методом hookProcess
, чье четко определенное задание заключается в внедрении DLL, так что вы точно знаете, что DLL должна быть внедрена. Возможно, вы захотите протестировать функцию, которая должна получать некоторые данные, и в настоящее время для этого нужно внедрить некоторые библиотеки DLL в некоторые процессы, но могут быть другие способы получения этой информации, которые не включают в себя внедрение DLL или внедрение различных библиотек DLL в разные процессы. , В этом случае проверка, для каких библиотек DLL внедряется, когда действительно нарушает инкапсуляцию, предоставляемую спецификацией «просто получить информацию в любом случае». Этот случай обсуждается ответом Дирка Херрманна.