2011-04-07 22 views
5

Tengo una clase cuyo constructor toma una función de Boost, y me gustaría probarla con Google Mock. El siguiente código muestra una clase de muestra y mi intento de probarlo:Uso de Google Mock con boost :: bind

MyClass.h:

#include <boost/function.hpp> 
class MyClass 
{ 
public: 
    MyClass(boost::function<void()> callback); 
    void callCallback(); 
private: 
    boost::function<void()> m_callback; 
}; 

MyClassTest.cpp:

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 
#include <boost/bind.hpp> 
#include "MyClass.h" 
class CallbackMock 
{ 
public: 
    MOCK_METHOD0(callback, void()); 
}; 

TEST(MyClassShould, CallItsCallback) 
{ 
    CallbackMock callbackMock; 
    MyClass myClass(boost::bind(&CallbackMock::callback, callbackMock)); 
    EXPECT_CALL(callbackMock, callback()).Times(1); 
    myClass.callCallback(); 
} 

Intentar compilar MyClassTest.cpp en Visual Studio 2008 da el siguiente error:

...gmock/gmock-generated-function-mockers.h(76) : error C2248: 'testing::internal::FunctionMockerBase::FunctionMockerBase' : cannot access private member declared in class 'testing::internal::FunctionMockerBase' 1> with 1> [ 1>
F=void (void) 1> ] 1>
.../gmock-spec-builders.h(1656) : see declaration of 'testing::internal::FunctionMockerBase::FunctionMockerBase' 1> with 1> [ 1>
F=void (void) 1> ] 1>
This diagnostic occurred in the compiler generated function 'testing::internal::FunctionMocker::FunctionMocker(const testing::internal::FunctionMocker &)' 1> with 1> [ 1>
Function=void (void) 1> ]

El error proviene de la línea que contiene abucheos t :: bind Reemplazar el método simulado con void callback() {} elimina el error de compilación (pero también elimina el uso de Google Mock, lo que frustra el propósito). ¿Es lo que intento hacer sin modificar la clase probada?

Respuesta

5

Creo que esta línea está mal:

MyClass myClass(boost::bind(&CallbackMock::callback, callbackMock));

El último parámetro debe ser &callbackMock

+0

Gracias, Ben, que lo arregló. –

16

La razón es que Google se burla Mock no son copiables - que es por diseño. Cuando intenta pasarlo a boost::bind por valor, el compilador no puede generar el constructor de copia. Usted debe tomar la dirección de la maqueta al pasar en bind:

MyClass myClass(boost::bind(&CallbackMock::callback, &callbackMock)); 
+0

Gracias por la aclaración adicional. –

+2

Esto realmente debería ser la respuesta aceptada. ¡Me has ahorrado mucho tiempo! Gracias Vlad! –

Cuestiones relacionadas