Supponiamo che io sono una classe C++ in questo modo:C++ e Dependency Injection in unit testing
class A
{
public:
A()
{
}
void SetNewB(const B& _b) { m_B = _b; }
private:
B m_B;
}
Al fine di test di unità qualcosa come questo, avrei dovuto rompere la dipendenza di A sul B. Poiché classe A tiene su un oggetto reale e non un puntatore, dovrei refactoring questo codice per prendere un puntatore. Inoltre, avrei bisogno di creare una classe di interfaccia genitore per B in modo da poter passare il mio falso di B quando eseguo il test di SetNewB.
In questo caso, il test dell'unità con l'iniezione di dipendenza non complica ulteriormente il codice esistente? Se creo un puntatore B, ora sto introducendo l'allocazione dell'heap e ora una parte di codice è responsabile della sua pulizia (a meno che non utilizzi i puntatori conteggio ref). Inoltre, se B è una classe piuttosto banale con solo un paio di variabili e funzioni membro, perché introdurre un'intera nuova interfaccia per questo invece di provare solo con un'istanza di B?
Suppongo che si possa argomentare che sarebbe più semplice rifattorizzare A usando un'interfaccia. Ma ci sono dei casi in cui due classi potrebbero dover essere strettamente accoppiate?
Interessante, suppongo che stavo immaginando che i test unitari richiedessero che tutte le classi fossero completamente separate l'una dall'altra. Ma come fai notare, A ha assolutamente bisogno che B lavori; quindi sono in realtà una sola unità. – lhumongous