2012-04-18 24 views
7

Quiero burlarse de un método que devuelve un datatyp complejogooglemock - se burlan de un método que devuelve un datatyp complejo

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

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

Este código no se compila: "macro 'MOCK_CONST_METHOD0' pasa 3 argumentos, pero sólo tarda 2 "

Creo que la macro googlemock no comprende QMap e interpreta la coma como separador de parámetros.

¿Hay alguna manera de decirle a Googlemock que QMap es el valor de retorno?

Respuesta

15

sólo tiene que utilizar un typedef así:

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, ¿no debería ser 'MOCK_CONST_METHOD1', ya que toma un parámetro? (buena solución, sin embargo) – Mawg

+1

@Mawg: 'aMethod' tiene cero parámetros, por lo tanto' MOCK_CONST_METHOD0' debe ser correcto. – nabulke

+0

Aaargh !! Leí mal ... qué embarazoso. Gracias por señalar eso – Mawg

3

Tiene razón, la coma se interpreta como un separador de parámetros. Puede definir una macro de preprocesador para evitar que la coma se interprete de esa manera.

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

Tenga en cuenta que esto no funcionará necesariamente para las llamadas de macro anidadas. Por ejemplo, si MOCK_CONSTANT_METHOD0 pasara el segundo parámetro a otra macro, estarías en problemas otra vez.

+1

¿Por qué la introducción de este 'define' evitar el error del compilador? El código resultante (después del preprocesamiento) es el mismo que en la pregunta. ¿Podría explicar por qué esto funciona? –

+0

@RonaldMcBean No sé por qué funciona, pero parece que el preprocesador extrae primero los parámetros y luego expande las macros en ellos. –

+2

[consulte esta respuesta para obtener una explicación de por qué funciona] (http://stackoverflow.com/a/10208278/913577) –

Cuestiones relacionadas