No , l'iniezione delle dipendenze non è essenziale per il test dell'unità.
L'iniezione delle dipendenze è utile se si ha una classe che ha bisogno di un'istanza di classe dipendente per eseguire alcuni processi secondari. Invece di DI puoi separare la logica di un metodo di business in una parte data-gethering (che non è testata dall'unità) e una parte di calcolo che può essere non testata.
Esempio (usando DI) Questa implementazione dipende da Dipendente, Account, ....
bool hasPermissionToTranferMony(Employee employee, Account from, Account to, Money amount)
{
if (amount > 100 && imployee.isStudent())
return false;
if (to.getOwner().getFamiliyName() == Employee.getFamiliyName() && ...
return false; // cannot transfer money to himself;
...
}
Dopo la separazione di data-gethering e calcolo
bool hasPermissionToTranferMony(Employee employee, Account from, Account to, Money amount)
{
return hasPermissionToTranferMony(employee.isStudent(), Employee.getFamiliyName(), to.getOwner().getFamiliyName(), ....);
}
// the actualal permission calculation
static bool hasPermissionToTranferMony(boolean isStudent, string employeeFamiliyName, string receiverFamiliyName, .....)
if (amount > 100 && isStudent)
return false;
if (receiverFamiliyName == employeeFamiliyName && ...
return false; // cannot transfer money to himself;
...
}
La parte di calcolo può essere facilmente testata senza l'iniezione di dipendenza.