Устаревший код модульного тестирования сложен. В общем, вам сначала придется провести рефакторинг, чтобы иметь возможность писать модульные тесты. Лучше всего делать очень маленькие шаги по рефакторингу, чтобы один за другим улучшать тестируемость, оставляя класс в рабочем состоянии. Я бы порекомендовал:
1.) Ввести «воспринимающие» переменные, которые позволяют проверять внутреннее состояние тестируемого класса на ключевых позициях (т.е. до и после вызова БД). Это позволит вам писать тесты, которые проверяют текущее поведение класса (на основе переменных общественного восприятия) без особого рефакторинга. Проверьте поведение класса на основе этих тестов и начните рефакторинг. Переменные восприятия являются временными и должны быть удалены после завершения рефакторинга. Они существуют только для того, чтобы в то же время писать тесты, поэтому вы можете безопасно выполнять рефакторинг.
2.) Один за другим замените ссылки на конкретные классы для ссылок на интерфейсы, которые вы передаете через конструктор. Для синглтона у вас есть два варианта, один из которых заключается в том, чтобы Singleton возвращал специальный экземпляр для модульного тестирования - это требует изменения реализации Singleton, но оставляет тестируемый класс неизменным. Вы можете делать это до тех пор, пока не сможете выполнить рефакторинг для использования зависимости интерфейса для замены Singleton.
Также я бы порекомендовал подобрать копию Эффективная работа с устаревшим кодом , в котором подробно описан этот пошаговый рефакторинг и особенно методы разрушения зависимостей.