Синглтон это скрытая глобальная переменная. Любой код берёт его сам, по сигнатуре метода зависимость не видна. Отсюда общее изменяемое состояние на всё приложение, трудный тест и порядок инициализации, который нигде не записан. Второй экземпляр, например для другого пользователя, завести нельзя: экземпляр один на процесс.
- тесту достаётся боевой объект, а не подделка
- состояние переживает тест и протекает в следующий
- обращения из разных потоков нужно защищать внутри самого синглтона