2012-01-20 25 views
10

acabo de empezar a trabajar en la unidad de pruebas (usando marco BOOST para las pruebas, pero para burla tengo que usar Google Mock) y tengo esta situación:métodos estáticos de pruebas unitarias Google Mock C++

class A 
{ 
static int Method1(int a, int b){return a+b;} 
}; 

class B 
{ 
static int Method2(int a, int b){ return A::Method1(a,b);} 
}; 

Por lo tanto, Necesito crear una clase falsa A, y hacer que mi clase B no use el Método1 real de la clase A, sino que use el simulacro.

No estoy seguro de cómo hacer esto, y no pude encontrar un ejemplo similar.

+0

no estoy familiarizado con gmock, pero podría no le ponga el enlace '' B.o' y mockA.o'? – Beta

+0

Hasta donde yo sé, hay alguna manera diferente de lidiar con métodos estáticos. Probablemente podría resolver esto haciendo que Method1 sea virtual, y agregar constructor en clase B, por lo que se ve algo así como B (A y a): a_in_class_b (a) {}, y entonces la llamada de Method1 se vería así: a_in_class_b -> Método1(); Pero quiero ver si hay alguna otra manera. – Jonhtra

Respuesta

14

Se podría cambiar la clase B en una plantilla:

template< typename T > 
class B 
{ 
public: 
static int Method2(int a, int b){ return T::Method1(a,b);} 
}; 

y luego crear una maqueta:

struct MockA 
{ 
    static MockCalc *mock; 
    static int Method2(int a, int b){ return mock->Method1(a,b);} 
}; 
class MockCalc { 
public: 
    MOCK_METHOD2(Method1, int(int,int)); 
}; 

Antes de cada prueba, inicializar el objeto de maqueta estática MockA::mock.

Otra opción es llamar directamente al A::Method1, crear un objeto funtor (tal vez std :: tipo de función) en la clase B, y llamar eso en el Método2. Entonces, es más simple, porque no necesitaría MockA, porque crearía una devolución de llamada a MockCalc :: Method1 para este objeto. Algo como esto:

class B 
{ 
public: 
static std::function< int(int,int) > f; 
static int Method2(int a, int b){ return f(a,b);} 
}; 

class MockCalc { 
public: 
    MOCK_METHOD2(Method1, int(int,int)); 
}; 

y inicializarlo:

MockCalc mock; 
B::f = [&mock](int a,int b){return mock.Method1(a,b);}; 
+1

Gracias, esta fue la respuesta que estaba buscando :) – Jonhtra

+0

@ user1160721 debe haber el botón "aceptar respuesta" a la izquierda, si esta es la respuesta que está buscando;) –

+0

O sí, puedo verlo ahora , Haré clic en él, soy nuevo aquí. Puedo ver que hay una calificación para cada usuario y esta "respuesta de aceptación" aumenta esta calificación :) Tengo otra pregunta similar relacionada con esto. ¿Publicar una nueva, o preguntar en el comentario? :) – Jonhtra

Cuestiones relacionadas