2012-01-13 6 views
10

Estoy usando gmock en mi proyecto y encuentro un problema para establecer una variable de referencia personalizada para una función simulada. Supongamos que tengo una clase de la siguiente manera:cómo establecer la variable de referencia personalizada en gmock

class XXXClient { 
public: 
    void QueryXXX(const Request&, Response&); 
}; 

class XXXRunner { 
public: 
    void DoSomething(XXXClient&); 
}; 

hay una clase de cliente XXXRunner :: HacerAlgo usando XXXClient :: QueryXXX, y quiero burlarse XXXClient para probar XXXRunner :: HacerAlgo.

Se produce el problema de que el segundo parámetro de QueryXXX, es decir, "Respuesta", no es un valor devuelto, sino una variable de referencia, que llevo algunos datos en Respuesta en XXXClient :: QueryXXX. Deseo establecer una información personalizada para la Respuesta para verificar diferentes condiciones de XXXRunner :: DoSomething.

gmock framework puede establecer el valor de retorno esperado, pero no puedo encontrar una forma de establecer la "variable devuelta"?

Entonces, ¿cómo hacerlo?

Respuesta

16

En primer lugar, hacer una clase simulada XXXClient, vamos a lo nombra XXXClientMock de la siguiente manera:

class XXXClientMock : public XXXClient 
{ 
public: 
    MOCK_METHOD2(QueryXXX, QueryResult (Request&, Response&)); 
}; 

A continuación, utilice GMock Acción SetArgReferee para establecer el parámetro personalizado, de la siguiente manera:

TEST(XXXRunnerTC, SetArgRefereeDemo) 
{ 
    XXXCLientMock oMock; 

    // set the custom response object 
    Response oRsp; 
    oRsp.attr1 = “…”; 
    oRsp.attr2 = “any thing you like”; 

    // associate the oRsp with mock object QueryXXX function 
    EXPECT_CALL(oMock, QueryXXX(_, _)). 
     WillOnce(SetArgReferee<1>(oRsp)); 
    // OK all done 

    // call QueryXXX 
    XXXRunner oRunner; 
    QueryResult oRst = oRunner.DoSomething(oMock); 
    … 

    // use assertions to verity your expectation 
    EXPECT_EQ(“abcdefg”, oRst.attr1); 
    …… 
} 

Resumen
GMock proporciona una serie de acciones para hacer que sea conveniente simular funciones, como SetArgReferee para referencia o valor, SetArgPointee para puntero, Return para devolución, Invoke para invocar función simulada personalizada (con lógica de prueba simple), puede ver here para obtener más detalles.

lo disfruten :) Gracias

Cuestiones relacionadas