5

我有一个类,其构造函数采用 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();
}

尝试在 Visual Studio 2008 中编译 MyClassTest.cpp 会出现以下错误:

...gmock/gmock-generated-function-mockers.h(76):错误 C2248:“testing::internal::FunctionMockerBase::FunctionMockerBase”:无法访问在类“testing::internal::FunctionMockerBase”中声明的私有成员1> with 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 > 带 1> [ 1>
函数=void (void) 1> ]

错误源于包含 boost::bind 的行。用 void callback(){} 替换 mocked 方法消除了编译错误(但也消除了 Google Mock 的使用,达不到目的)。在不修改测试类的情况下,我尝试做的事情是否可行?

4

2 回答 2

17

原因是 Google Mock 模拟是不可复制的——这是设计使然。当您尝试boost::bind按值传递它时,编译器无法生成复制构造函数。将模拟地址传递给时,您应该获取模拟地址bind

MyClass myClass(boost::bind(&CallbackMock::callback, &callbackMock));
于 2011-04-07T21:40:12.723 回答
5

我认为这条线是错误的:

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

最后一个参数应该是&callbackMock

于 2011-04-07T21:31:17.017 回答