Não , a injeção de dependência não é essencial para o teste de unidade.
A injeção de dependência ajuda se você tiver uma classe que precisa de uma instância de classe dependente para realizar algum subprocessamento. Em vez de DI, você pode separar a lógica de um método comercial em uma parte de coleta de dados (que não pode ser testada por unidade) e uma parte de cálculo que pode ser testada por unidade.
Exemplo (usando DI) Esta implementação depende de Funcionário, Conta, ...
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;
...
}
Após a separação da coleta e cálculo dos dados:
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
...
}
A parte do cálculo pode ser facilmente testada sem injeção de dependência.