Использование Google Mock с boost :: bind - PullRequest
5 голосов
/ 07 апреля 2011

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

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();
}

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

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

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

Ответы [ 2 ]

17 голосов
/ 08 апреля 2011

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

MyClass myClass(boost::bind(&CallbackMock::callback, &callbackMock));
5 голосов
/ 08 апреля 2011

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

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

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

...