2012-01-20 13 views
10

Ho appena iniziato a lavorare su test di unità (utilizzando il framework BOOST per il test, ma per deride devo utilizzare Google Mock) e ho questa situazione:metodi statici di unit test 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);} 
}; 

Così, ho ho bisogno di creare una classe di simulazione A, e di fare in modo che la mia classe B non utilizzi il Metodo1 reale dalla classe A, ma di usare la simulazione.

Non sono sicuro di come farlo e non ho trovato alcun esempio simile.

+0

io non sono a conoscenza gmock, ma non poteva basta collegare '' B.o' e mockA.o'? – Beta

+0

Per quanto ne so, c'è un modo diverso di gestire i metodi statici. Probabilmente potrei risolvere questo problema rendendo il Method1 virtuale e aggiungendo il costruttore in classe B, quindi sembra qualcosa di simile a B (A & a): a_in_class_b (a) {}, e quindi la chiamata di Method1 sarebbe simile a questa: a_in_class_b -> Metodo 1(); Ma voglio vedere se c'è un altro modo. – Jonhtra

risposta

14

Si potrebbe cambiare la classe B in un modello:

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

e quindi creare un finto:

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

Prima di ogni test, inizializzare l'oggetto fittizio statica MockA::mock.

Un'altra opzione è chiamare invece direttamente A::Method1, creare un oggetto funtore (forse std :: tipo di funzione) in classe B e chiamarlo in Method2. Quindi, è più semplice, perché non avresti bisogno di MockA, perché dovresti creare un callback a MockCalc :: Method1 su questo oggetto. Qualcosa di simile a questo:

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

e inizializzare:

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

Grazie, questa era la risposta che stavo cercando :) – Jonhtra

+0

@ user1160721 ci dovrebbe essere il pulsante "accetta risposta" a sinistra, se questa risposta è quella che stai cercando;) –

+0

O sì, posso vederlo ora , Clicco, sono nuovo qui. Vedo che c'è una valutazione per ogni utente e questa "risposta di accettazione" aumenta questa valutazione :) Ho una domanda simile in più relativa a questo. Per postarne uno nuovo o per chiederlo nel commento? :) – Jonhtra