No , l'iniezione di dipendenza non è essenziale per i test unitari.
L'iniezione di dipendenza aiuta se si dispone di una classe che necessita di un'istanza di classe dipendente per eseguire una subelaborazione. Invece di DI è possibile separare la logica di un metodo di business in una parte di raccolta dati (che non è testabile dall'unità) e una parte di calcolo che può essere testata dall'unità.
Esempio (utilizzando DI) Questa implementazione dipende da Dipendente, 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;
...
}
Dopo la separazione dei dati raccolti e il calcolo:
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
...
}
La parte di calcolo può essere facilmente testata senza iniezione di dipendenza.