2012-04-18 22 views
7

Chcę mock metodę, która zwraca złożoną datatypgooglemock - mock metodę, która zwraca złożoną datatyp

class aClass 
{ 
public: 
    virtual const QMap<QString, QString> aMethod() const; 
} 

class MockaClass : public aClass 
{ 
public: 
    MOCK_CONST_METHOD0(aMethod, const QMap<QString, QString>()); 
} 

Ten kod nie kompilacji: „makro«MOCK_CONST_METHOD0»przeszły 3 argumenty, ale trwa tylko 2 "

Myślę, że makro googlemock nie rozumie QMap i interpretuje przecinka jako separatora parametrów.

Czy istnieje sposób na określenie googlemock, że QMap jest wartością zwracaną?

Odpowiedz

15

Wystarczy użyć typedef takiego:

class aClass 
{ 
public: 
    typedef const QMap<QString, QString> MyType; 
    virtual MyType aMethod() const; 
} 

class MockaClass : public aClass 
{ 
public: 
    MOCK_CONST_METHOD0(aMethod, MyType()); 
} 
+0

Błąd, czy nie powinien to być 'MOCK_CONST_METHOD1', ponieważ zajmuje on jeden parametr? (dobre rozwiązanie, chociaż) – Mawg

+1

@Mawg: 'aMethod' ma zero parametrów, dlatego' MOCK_CONST_METHOD0' powinien być poprawny. – nabulke

+0

Aaargh !! Nie rozumiem ... jakie to zawstydzające. Dziękuję za wskazanie tego – Mawg

3

Masz rację, przecinek jest interpretowany jako separator parametrów. Można zdefiniować makro preprocesora, aby chronić przecinek przed interpretacją w ten sposób.

#define COMMA , 
MOCK_CONSTANT_METHOD0(aMethod, const QMap<QString COMMA QString>()); 

Należy pamiętać, że niekoniecznie będzie działać w przypadku zagnieżdżonych wywołań makr. Na przykład, jeśli MOCK_CONSTANT_METHOD0 przejdzie drugi parametr do innego makra, będziesz miał kłopoty ponownie.

+1

Dlaczego wprowadzenie tego 'define' uniknąć błędu kompilatora? Wynikowy kod (po wstępnym przetworzeniu) jest taki sam jak w pytaniu. Czy możesz wyjaśnić, dlaczego to działa? –

+0

@RonaldMcBean Nie wiem, dlaczego to działa, ale wygląda na to, że preprocesor najpierw wyodrębnia parametry, a następnie rozszerza je w nich. –

+2

[zobacz tę odpowiedź, aby dowiedzieć się, dlaczego to działa] (http://stackoverflow.com/a/10208278/913577) –

Powiązane problemy