2011-04-07 9 views
5

J'ai une classe dont le constructeur utilise une fonction Boost, et j'aimerais la tester avec Google Mock. Le code suivant montre un exemple de classe et ma tentative de le tester:Utiliser Google Mock avec 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(); 
} 

Tentative de compilation MyClassTest.cpp dans Visual Studio 2008 donne l'erreur suivante:

...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> ]

L'erreur provient de la ligne contenant boos t :: bind. Le remplacement de la méthode mockée par callback void() {} élimine l'erreur de compilation (mais élimine également l'utilisation de Google Mock, en vainant le but). Est ce que j'essaie de faire possible sans modifier la classe testée?

Répondre

5

Je pense que cette ligne est faux:

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

Le dernier paramètre devrait être &callbackMock

+0

Merci, Ben, qui l'a corrigé. –

16

La raison en est que Google se moque Mock ne sont pas copiables - qui est par la conception. Lorsque vous essayez de le transmettre en valeur par boost::bind, le compilateur ne parvient pas à générer le constructeur de copie. Vous devriez prendre l'adresse de la maquette en la passant dans bind:

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

Merci pour la clarification supplémentaire. –

+2

Cela devrait vraiment être la réponse acceptée. Vous venez de me sauver beaucoup de temps !!! Merci Vlad! –

Questions connexes