По моему опыту, TDD очень поддерживает принципы объектно-ориентированного проектирования.
Внедрение зависимостей не является артефактом TDD, оно обычно используется при проектировании платформ ОО независимо от методологии разработки.
Внедрение зависимостей связано со слабой связью - если в классе A используется один или несколько объектов из класса b, хороший дизайн сведет к минимуму знания класса A о внутренних элементах класса B. Я полагаю, что это то, на что вы ссылаетесь, когда вы упомянуть «сокрытие информации».
Подумайте, что произойдет, если класс B изменит свою реализацию. Или, более сложный, но все еще распространенный случай: что если вы хотите динамически заменить в разных подклассах B в зависимости от ситуации (например, вы можете использовать шаблон Strategy), но класс, который принимает это решение, не класс А.
По этой причине в Java есть интерфейсы. Вместо того чтобы делать класс A зависимым от класса B, вы делаете его зависимым от интерфейса, который реализует класс B. Затем вы можете заменить любой класс, который реализует этот интерфейс, без изменения кода внутри A.
Это включает, но не ограничивается, заменой поддельных объектов для целей тестирования.
TDD полностью использует Dependency Injection. Также как TDD использует много принципов ОО. Но DI - это принцип ОО, а не принцип TDD.