DI frameworks like Guice and Spring are the common tools to abstract out dependencies to make Java code testable. However, there are several alternate methods to achieve the same goals. One in particular is making the code to test depend directly on certain classes and then varying which implementations of those classes are in the classpath at test and run time, as SLF4J does.
Are there compelling reasons to use DI frameworks instead of the classpath to control dependencies? If not, why is the latter approach not more common given that it is simpler and uses only built-in functionality?