Dependency injection is one of the most fundamental aspects of Angular. The Angular team has been very careful in using dependency injection since its first release of the Angular 1.x version and this has been the primary reason that Angular applications are easy to test.
The ability to write good, robust tests for an application largely depends on how the application manages dependencies. If the application creates concrete dependencies in its classes than it becomes very difficult to write test cases for individual classes, whereas if the dependencies are not the primary responsibility of a class, then writing test cases for that class becomes so much simpler.
We have been implicitly relying on dependency injection since our first application, and some of the code examples in our Trello application where we use Angular's dependency...