Платформы внедрения зависимостей, такие как Google Guice, дают следующую мотивацию для их использования ( источник ):
Чтобы построить объект, вы сначала строите его зависимости. Но для построения каждой зависимости вам нужны ее зависимости и так далее. Поэтому, когда вы строите объект, вам действительно нужно построить граф объектов.
Создание графов объектов вручную является трудоемким (...) и затрудняет тестирование.
Но я не куплю этот аргумент: даже без инфраструктуры внедрения зависимостей я могу писать классы, которые легко создавать и тестировать. Например, пример со страницы мотивации Guice можно переписать следующим образом:
class BillingService
{
private final CreditCardProcessor processor;
private final TransactionLog transactionLog;
// constructor for tests, taking all collaborators as parameters
BillingService(CreditCardProcessor processor, TransactionLog transactionLog)
{
this.processor = processor;
this.transactionLog = transactionLog;
}
// constructor for production, calling the (productive) constructors of the collaborators
public BillingService()
{
this(new PaypalCreditCardProcessor(), new DatabaseTransactionLog());
}
public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard)
{
...
}
}
Таким образом, могут быть другие аргументы для структур внедрения зависимостей ( которые выходят за рамки этого вопроса !), Но легкое создание графов тестируемых объектов не является одним из них, не так ли?
new ShippingService()
.