Нет , внедрение зависимостей не является обязательным для модульного тестирования.
Внедрение зависимостей помогает, если у вас есть класс, которому нужен зависимый экземпляр класса для некоторой подпроцессорной обработки. Вместо DI вы можете разделить логику бизнес-метода на часть получения данных (которая не проверяется на единицу) и часть вычисления, которая может быть проверена на единицу.
Пример (с использованием DI) Эта реализация зависит от Employee, Account, ...
bool hasPermissionToTransferMoney(Employee employee, Account from, Account to, Money amount)
{
if (amount > 100 && employee.isStudent())
return false;
if (to.getOwner().getFamiliyName() == employee.getFamilyName() && ...
return false; // cannot transfer money to himself;
...
}
После разделения сбора данных и расчета:
bool hasPermissionToTransferMoney(Employee employee, Account from, Account to, Money amount)
{
return hasPermissionToTransferMoney(employee.isStudent(), employee.getFamilyName(), to.getOwner().getFamilyName(), ...);
}
// the actual permission calculation
static bool hasPermissionToTransferMoney(boolean isStudent, string employeeFamilyName, string receiverFamilyName, ...)
if (amount > 100 && isStudent)
return false;
if (receiverFamilyName == employeeFamiliyName && ...
return false; // cannot transfer money to himself
...
}
Расчетная часть может быть легко протестирована без внедрения зависимостей.