Pregunta

Estoy tratando de burlarse de un método de plantilla.

Aquí está la clase que contiene el método para burlarse:

class myClass
{
public:
    virtual ~myClass() {}

    template<typename T>
    void myMethod(T param);
}

¿Cómo puedo burlar el método myMethod usando Google Mock?

¿Fue útil?

Solución

En la versión anterior de Google Mock puede funciones virtuales solamente simulacros, consulte la documentación en la página del proyecto.

Las versiones más recientes permitió simulacro métodos no virtuales , usando lo que ellos llaman inyección de dependencias hi-perf .

A medida que los estados congusbongus:

  

Google Mock se basa en la adición de variables miembro de método de soporte de burla, y puesto que no se puede crear variables miembro plantilla, es imposible funciones de plantilla simulacros

Una solución, por Michael Harrington en los googlegroups enlace de los comentarios, es dar a los métodos especializados de plantilla que va a llamar a una función normal que puede ser burlado. No resuelve el caso general, pero que trabajará para la prueba.

struct Foo
{
    MOCK_METHOD1(GetValueString, void(std::string& value));

    template <typename ValueType>
    void GetValue(ValueType& value); 

    template <>
    void GetValue(std::string& value) {
        GetValueString(value);
    } 
};

Otros consejos

Aquí está el post original de nuevo con los comentarios para ayudar a comprender:

    struct Foo 
    { 
        // Our own mocked method that the templated call will end up calling.
        MOCK_METHOD3(GetNextValueStdString, void(const std::string& name, std::string& value, const unsigned int streamIndex)); 

        // If we see any calls with these two parameter list types throw and error as its unexpected in the unit under test.
        template< typename ValueType > 
        void GetNextValue( const std::string& name, ValueType& value, const unsigned int streamIndex ) 
        { 
            throw "Unexpected call."; 
        } 
        template< typename ValueType > 
        void GetNextValue( const std::string& name, ValueType& value ) 
        { 
            throw "Unexpected call."; 
        } 

        // These are the only two templated calls expected, notice the difference in the method parameter list. Anything outside
        // of these two flavors is considerd an error.
        template<> 
        void GetNextValue< std::string >( const std::string& name, std::string& value, const unsigned int streamIndex ) 
        { 
            GetNextValueStdString( name, value, streamIndex ); 
        } 
        template<> 
        void GetNextValue< std::string >( const std::string& name, std::string& value ) 
        { 
            GetNextValue< std::string >( name, value, 0 ); 
        } 
    }; 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top