Global state (and singletons) is a big problem for testing because the global state cannot be controlled by the tests.
Dependency injection enforces the order of initialization at compile time. No magic behind the scene, that singletons get initialized and method talk to each other without the programmer knowing it.