2012-07-03 8 views
5

sto usando google finto, e voglio prendere in giro una catena di ereditarietà in questo modo:Come deridere catena di ereditarietà in C++ con Google beffe

class A 
{ 
    // virtual method A1(); 
} 
class B : public A 
{ 
    // virtual method B1(); 
} 

class C : public B 
{ 
    // virtual method C1(); 
} 

Quando finta A, ho bisogno di prendere in giro A1(); quando simulando B, devo prendere in giro sia A1() che B1(); quando mock C, devo prendere in giro C1(), B1() e A1().

//Mock Definition 
class MockA : public A 
{ 
    // mockA1() 
} 

class MockB : public B 
{ 
    // mockA1() 
    // mockB1() 
} 

class MockC : public C 
{ 
    // mockA1() 
    // mockB1() 
    // mockC1() 
} 

Tuttavia, per la classe C, mi interessa solo la nuova funzione estesa C1(). Non volevo prendere in giro tutto il suo metodo genitore, specialmente quando sono definiti troppi metodi. Ma, non posso istanziare la classe mockC se non prendevo in giro tutti i metodi ereditati dal suo genitore.

Un modo è quello di richiedere mockC ereditare sia da C e mockB, tuttavia si richiede sia C e mockB pura ereditano dalla B. ma il C-> B-> A catena di ereditarietà è definita nel codice di terze parti che non posso modificare.

// I cannot change this to virtual inheritance 
class C : public virtual B 
{ 
    //method C1(); 
} 

class mockB : public virtual B 
{ 
    // mthod B1() 
} 

class mockC: public C, public mockB 
{ 
    // mock method C1(); 
} 

C'è qualche buon modo per risolvere questo problema?

+0

Quindi tutti i metodi virtuali di A e B sono puramente virtuali? – Fraser

+0

I mazzi possono ereditare gli uni dagli altri (beh, non circolarmente), quindi non dovresti riscrivere tutti i metodi; guarda la risposta accettata a: [Mock Inheritance] (http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh , mi aiuta se leggo fino in fondo, sul codice di terze parti. Mi dispiace per quello! – dwanderson

risposta

1

Crea finto solo per l'ultima classe nella gerarchia di ereditarietà. Quindi utilizzalo in tutti i test che richiedono una classe nella gerarchia. Secondo il vostro esempio, è possibile creare solo classe mockC:

class MockC : public C { 
    // mockA1() 
    // mockB1() 
    // mockC1() 
} 

poi passarlo a tutte le classi è necessario verificare che dipende Un o B o C. Questo non sembrerebbe illogico.