Sono uno sviluppatore di software abbastanza nuovo che attualmente sta lavorando aggiungendo i test unitari a un progetto C++ esistente iniziato anni fa. A causa di un motivo non tecnico, non sono autorizzato a modificare alcun codice esistente. La classe base di tutti i miei moduli ha un sacco di metodi per impostare/ottenere dati e comunicare con altri moduli.Mocking di metodi non virtuali in C++ senza modificare il codice di produzione?
Dato che voglio testare ogni singolo modulo, voglio essere in grado di utilizzare valori predefiniti per tutti i miei metodi di comunicazione tra moduli. Cioè per un metodo Ping() che controlla se un altro modulo è attivo, voglio averlo restituito vero o falso in base al tipo di test che sto facendo. Ho esaminato Google Test e Google Mock e supporta metodi di simulazione non virtuali. Tuttavia l'approccio descritto (http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods) mi obbliga a "templatizzare" i metodi originali per prendere oggetti reali o fittizi. Non posso andare a templatizzare i miei metodi nella classe base a causa del requisito menzionato prima, quindi ho bisogno di un altro modo di deridere questi metodi virtuali
Fondamentalmente, i metodi che voglio prendere in giro sono in qualche classe base, il I moduli che voglio testare e creare mock di sono classi derivate di quella classe base. Ci sono moduli intermedi tra la mia classe del modulo base e i moduli che voglio testare.
Gradirei qualsiasi consiglio!
Grazie,
JW
EDIT: A esempi più concreti
La mia classe di base è diciamo rootModule, il modulo che voglio testare è leafModule. Esiste un modulo intermedio che eredita da rootModule, leafModule eredita da questo modulo intermedio.
Nel mio leafModule, voglio testare il metodo doStuff(), che chiama il GetStatus (moduleName) non virtuale definito nella classe rootModule. Devo in qualche modo rendere GetStatus() per restituire un valore predefinito scelto. Il derisione è nuovo per me, quindi usare gli oggetti finti anche l'approccio giusto?
È possibile modificare localmente il codice solo per i test? Non dovresti effettuare il check-in delle modifiche. –
È necessario utilizzare i test unitari? Esistono altri metodi (automatizzati) di test di regressione. Il test unitario è uno strumento, non una religione - se non si adatta, non usarlo. – ima
Idealmente il mio team vorrebbe utilizzare i test unitari, visto che il nostro albero dei moduli è piuttosto grande, vorremmo davvero disaccoppiare il testing delle funzionalità tra moduli dal test dei metodi locali di un modulo. È spiacevole però che le nostre precedenti decisioni di progettazione abbiano reso le prove unitarie un po 'una sfida. A quali altri metodi di test di regressione ti stai riferendo? Immagino che, usando altre metodologie di test, avremo ancora bisogno di una sorta di metodo per impostare i metodi non virtuali o restituire valori predefiniti, il che significa che troveremo una soluzione alternativa o manterremo un altro albero dei sorgenti intorno. – wk1989