2012-04-18 21 views
7

voglio prendere in giro un metodo che restituisce un datatyp complessogooglemock - deridere un metodo che restituisce un datatyp complesso

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

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

Questo codice non compila: "macro 'MOCK_CONST_METHOD0' passato 3 argomenti, ma richiede solo 2 "

Penso che la macro googlemock non comprenda QMap e interpreti la virgola come separatore di parametri.

C'è un modo per dire a googlemock che QMap è il valore restituito?

risposta

15

Basta usare un typedef come questo:

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, non dovrebbe essere "MOCK_CONST_METHOD1', poiché accetta un parametro? (buona soluzione, comunque) – Mawg

+1

@Mawg: 'aMethod' ha zero parametri, quindi' MOCK_CONST_METHOD0' dovrebbe essere corretto. – nabulke

+0

Aaargh !! Ho letto male ... che imbarazzo. Grazie per la segnalazione – Mawg

3

Hai ragione, la virgola è interpretata come un separatore di parametri. È possibile definire una macro del preprocessore per proteggere la virgola dall'interpretazione in questo modo.

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

Si noti che questo non funziona necessariamente per le chiamate macro nidificate. Ad esempio, se MOCK_CONSTANT_METHOD0 passasse il secondo parametro a un'altra macro, ci si troverebbe di nuovo nei guai.

+1

Perché l'introduzione di questo 'define' evitare l'errore del compilatore? Il codice risultante (dopo la pre-elaborazione) è lo stesso della domanda. Potresti spiegare, perché funziona? –

+0

@RonaldMcBean Non so perché funzioni, ma sembra che il preprocessore estrae prima i parametri e poi espande i macro in essi. –

+2

[vedere questa risposta per una spiegazione del motivo per cui funziona] (http://stackoverflow.com/a/10208278/913577) –

Problemi correlati