- Classes are more modular, as they depend only on the interface of passed-in dependencies. Class behavior can be changed by swapping out a new component.
- Testing is simplified, since stubs can be substituted for any dependency.
- It's harder to understand how a class works when reading just that class. You may have to track down its invocation to see what kind of components are passed in.
- Is DepedencyClass.expects(:new).returns(stub)) a smell, since we should have injected that stub to the class that uses it instead?
- If a class uses DI, should one only pass in already-instantiated dependencies, or is it okay to let the calling class instantiate them?
- Am I missing any pros or cons?
Ben - Re: "It's harder to understand how a class works when reading just that class." Kind of a blanket statement - You don't really define the alternative. Is the alternative having the code in the class instead of injecting it from the outside?
Even with injection, you could include an inner class that defines a "do nothing" default that provides some hints regarding a proper collaborator.