2012-07-03 12 views
5

estoy usando Google maqueta, y quiero burlarse de una cadena de herencia de esta manera:Cómo se burlan de la cadena de herencia en C++ con Google burlarse

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

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

Cuando simulacro A, necesito burlarse A1(); cuando simula B, tengo que simular tanto A1() como B1(); cuando simula C, tengo que burlarme de C1(), B1() y A1().

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

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

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

Sin embargo, para la clase C, solo me importa la nueva función extendida C1(). No quería burlarme de todo su método principal especialmente cuando hay demasiados métodos definidos. Pero no puedo crear una instancia de la clase mockC si no me he burlado de todos los métodos heredados de su padre.

Una forma es exigir que mockC herede tanto C como mockB, sin embargo, requiere tanto C como mockB heredar de B. pero la cadena de herencia C-> B-> A está definida en código de terceros que no puedo cambio.

// 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(); 
} 

¿Hay alguna manera de solucionar este problema?

+0

¿Entonces todos los métodos virtuales de A y B son puramente virtuales? – Fraser

+0

Los mocks pueden heredarse entre sí (bueno, no circularmente), por lo que no tendría que volver a escribir todos los métodos; mira la respuesta aceptada a: [Mock Herencia] (http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh , ayuda si leo hasta el final, sobre el código de un tercero. ¡Lo siento por eso! – dwanderson

Respuesta

1

Crea simulacro solo para la última clase en tu jerarquía de herencia. Luego, úselo en todas las pruebas que necesiten cualquier clase en la jerarquía. De acuerdo con el ejemplo, puede crear única clase mockC:

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

luego pasarlo a todas las clases que necesita para probar eso depende de A o B o C. Esto no parece ilógico.

Cuestiones relacionadas