Sono in procinto di integrare un Unit Test Framework per un codice esistente in C ++. Ho azzerato CxxTest, ma come risulta possiamo usare altri Mocking Framework (come googlemock) anche in combinazione con CxxTest.
Dopo aver letto le esercitazioni su CxxTest (Mocking) e googlemock (l'infame esempio di tartaruga), ho l'idea generale che devi definire una classe di simulazione (usando le macro ecc.), dichiarare un oggetto della classe di simulazione e poi passarlo alla funzione sei unità di test. Ora, ci sono molte occorrenze nella base di codice esistente dove non è possibile farlo.
Ecco uno pseudo esempio per chiarire:
class CCandidateForTest
{
public:
bool foo(int a)
{
CAnotherClass obj;
int b = obj.bar(a+2);
if (a == b) {
return true;
} else {
return false;
}
}
}
(Questo è troppo semplificato, ci sono anche delle eccezioni e i tipi primitivi possono anche essere altri oggetti ecc., ma si ottiene l'idea generale) (inoltre, la creazione di oggetti non è sempre diretta e può talvolta utilizzare una fabbrica)
Voglio scrivere un test per la funzione CCandidateForTest::foo
. Questo metodo crea internamente un oggetto di CAnotherClass
, che ho bisogno di simulare in modo che CAnotherClass::bar
restituisca valori diversi in modo che percorsi di codice diversi in foo
siano attraversati durante il test delle unità.
In poche parole, il problema è che la funzione testata internamente crea un oggetto della classe che deve essere preso in giro, quindi non è possibile passare un'istanza dell'oggetto burlato alla funzione.
Come uso il mocking in questo caso? Esiste un quadro di derisione specifico che rende questo possibile?