Использование Google Mock с boost::bind

У меня есть класс, конструктор которого принимает функцию Boost, и я хотел бы протестировать его с помощью Google Mock. В следующем коде показан пример класса и моя попытка его протестировать:

МойКласс.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();
}

Попытка скомпилировать MyClassTest.cpp в Visual Studio 2008 дает следующую ошибку:

... gmock/gmock-generated-function-mockers.h(76): ошибка C2248: 'testing::internal::FunctionMockerBase::FunctionMockerBase': невозможно получить доступ к частному члену, объявленному в классе 'testing::internal::FunctionMockerBase' 1> с 1> [ 1>
F=void (void) 1> ] 1>
.../gmock-spec-builders.h(1656) : см. объявление 'testing::internal:: FunctionMockerBase::FunctionMockerBase' 1> with 1> [ 1>
F=void (void) 1> ] 1>
Эта диагностика произошла в сгенерированной компилятором функции 'testing::internal::FunctionMocker::FunctionMocker( const testing::internal::FunctionMocker &)' 1> with 1> [ 1>
Function=void (void) 1> ]

Ошибка возникает из-за строки, содержащей boost::bind. Замена mocked-метода на void callback(){} устраняет ошибку компиляции (но также устраняет использование Google Mock, что противоречит цели). Возможно ли то, что я пытаюсь сделать, без изменения тестируемого класса?


person Dave Taflin    schedule 07.04.2011    source источник


Ответы (2)


Я думаю, что эта строка неверна:

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

Последний параметр должен быть &callbackMock

person Ben    schedule 07.04.2011

Причина в том, что макеты Google Mock нельзя копировать — это сделано специально. Когда вы пытаетесь передать его в boost::bind по значению, компилятору не удается сгенерировать конструктор копирования. Вы должны взять адрес макета при передаче его в bind:

MyClass myClass(boost::bind(&CallbackMock::callback, &callbackMock));
person VladLosev    schedule 07.04.2011
comment
Спасибо за дополнительное разъяснение. - person Dave Taflin; 08.04.2011
comment
Это действительно должен быть принятый ответ. Вы только что сэкономили мне кучу времени!!! Спасибо Влад! - person Tobias Furuholm; 18.03.2012