Глобальные переменные и синглтоны настолько похожи с точки зрения тестируемости, что их не нужно обрабатывать отдельно. Хороший ОО-дизайн должен быть похож на кирпичи Lego, которые объединяются, чтобы создать получившуюся систему. Основная проблема с глобалами заключается в том, что вы теряете изоляцию. Когда вы получаете доступ к своим соавторам с помощью глобальных или единичных элементов, классы больше не являются отдельными блоками, которые вы можете легко взять и реорганизовать, использовать отдельно или повторно использовать в другом проекте. Когда вы берете какой-то класс, который зависит от глобалов, вы перетаскиваете остальную часть дизайна с ним. При тестировании это создает проблемы, потому что вы должны предпринять дополнительные шаги, чтобы обрезать соединения между вашим классом и его соавторами, чтобы вы могли проверить его изолированно. (Я написал подробнее об этом в своем блоге.)
Хорошим решением проблемы является предоставление зависимостей класса извне. Вы просто вводите какой-то механизм (возможно, простой класс), который возьмет все изолированные блоки и соединит их с графом объектов, составляющим ваше приложение. Это и есть Инверсия Контроля и Внедрение Зависимостей.