2012-01-20 16 views
10

Właśnie rozpoczął prace nad testów jednostkowych (za pomocą ramy impuls dla testowania, ale dla mocks muszę używać Google Mock) i mam taką sytuację:Google Mock testowania jednostka metody statyczne 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);} 
}; 

Więc muszę stworzyć fałszywą klasę A i sprawić, że moja klasa B nie użyje prawdziwej Metody 1 z klasy A, ale żeby użyć mocku.

Nie jestem pewien, jak to zrobić i nie mogłem znaleźć podobnego przykładu.

+0

nie jestem zaznajomiony z gmock, ale nie można po prostu połączyć 'B.o' i' mockA.o'? – Beta

+0

O ile mi wiadomo, istnieje inny sposób radzenia sobie z metodami statycznymi. Prawdopodobnie mógłbym rozwiązać ten problem, dodając, że metoda 1 jest wirtualna i dodaje konstruktor w klasie B, więc wygląda na B (A & a): a_in_class_b (a) {}, a następnie wywołanie metody 1 będzie wyglądać tak: a_in_class_b -> Metoda1(); Ale chcę sprawdzić, czy jest jakiś inny sposób. – Jonhtra

Odpowiedz

14

Można zmienić klasy B do szablonu:

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

a następnie tworzyć makiety:

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

Przed każdym badaniem zainicjować statycznych atrapa obiektu MockA::mock.

Inną opcją jest zamiast tego zadzwonić bezpośrednio pod numer A::Method1, utworzyć obiekt funktora (może std :: function type) w klasie B i wywołać go w Method2. Następnie jest to prostsze, ponieważ nie potrzebujesz MockA, ponieważ możesz utworzyć wywołanie zwrotne do MockCalc :: Method1 do tego obiektu. Coś takiego:

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

i aby ją zainicjować:

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

Dziękuję, to była odpowiedź, której szukałem :) – Jonhtra

+0

@ user1160721 powinien być po lewej stronie przycisk "zaakceptuj odpowiedź", jeśli ta odpowiedź jest tym, którego szukasz;) –

+0

O tak, widzę to teraz , Kliknę to, jestem nowy tutaj. Widzę, że istnieje pewna ocena dla każdego użytkownika i ta "akceptuj odpowiedź" zwiększa tę ocenę :) Mam jeszcze jedno podobne pytanie związane z tym. Aby opublikować nową wiadomość lub zapytać w komentarzu? :) – Jonhtra