2012-04-18 13 views
7

ich eine Methode verspotten wollen, die eine komplexe datatyp zurückgooglemock - eine Methode spotten, die eine komplexe datatyp gibt

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

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

Dieser Code kompiliert nicht: „Makro‚MOCK_CONST_METHOD0‘3 Argumente übergeben, aber es nimmt nur 2 "

Ich denke, dass das googlemock Makro QMap nicht versteht und das Komma als Parametertrennzeichen interpretiert.

Gibt es eine Möglichkeit, googlemock zu sagen, dass QMap der Rückgabewert ist?

Antwort

15

Nur ein typedef wie folgt verwenden:

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

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

Errrrm, sollte das nicht 'MOCK_CONST_METHOD1' sein, da es einen Parameter benötigt? (gute Lösung) – Mawg

+1

@Mawg: 'aMethod' hat keine Parameter, daher sollte' MOCK_CONST_METHOD0' korrekt sein. – nabulke

+0

Aaargh !! Ich habe falsch gelesen ... wie peinlich. Danke, dass du darauf hingewiesen hast – Mawg

3

Sie haben Recht, das Komma wird als Parametertrennzeichen interpretiert. Sie können ein Präprozessor-Makro definieren, um zu verhindern, dass das Komma so interpretiert wird.

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

Bitte beachten Sie, dass dies nicht unbedingt für verschachtelte Makroaufrufe funktioniert. Wenn zum Beispiel MOCK_CONSTANT_METHOD0 den zweiten Parameter an ein anderes Makro übergibt, wären Sie wieder in Schwierigkeiten.

+1

Warum die Einführung dieses 'define' den Compiler-Fehler vermeiden? Der resultierende Code (nach der Vorverarbeitung) ist derselbe wie in der Frage. Können Sie erklären, warum das funktioniert? –

+0

@RonaldMcBean Ich weiß nicht, warum das funktioniert, aber es scheint, als ob der Präprozessor die Parameter zuerst extrahiert und dann die Makros in ihnen erweitert. –

+2

[siehe diese Antwort für eine Erklärung, warum es funktioniert] (http://stackoverflow.com/a/10208278/913577) –

Verwandte Themen