Nie , wstrzykiwanie zależności nie jest niezbędne do testów jednostkowych.
Wstrzykiwanie zależności pomaga, jeśli masz klasę, która potrzebuje zależnej instancji klasy, aby wykonać pewne przetwarzanie podrzędne. Zamiast DI można rozdzielić logikę metody biznesowej na część gromadzącą dane (która nie może być testowana jednostkowo) i część obliczeniową, którą można przetestować jednostkowo.
Przykład (przy użyciu DI) Ta implementacja zależy od pracownika, konta, ...
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;
...
}
Po oddzieleniu gromadzenia danych i obliczeń:
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
...
}
Część obliczeniową można łatwo przetestować bez wstrzykiwania zależności.