使用Google Mock和boost :: bind

Dav*_*lin 5 c++ boost bind googletest gmock

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

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();
}
Run Code Online (Sandbox Code Playgroud)

尝试在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>
功能=无效(无效)1>]

该错误源于包含boost :: bind的行.用void callback()替换mocked方法消除了编译错误(但也消除了使用Google Mock,破坏了目的).在没有修改测试类的情况下,我正在尝试做什么?

Vla*_*sev 17

原因是谷歌模拟模拟不可复制 - 这是设计的.当您尝试boost::bind按值传递它时,编译器无法生成复制构造函数.将模拟地址传递给bind:

MyClass myClass(boost::bind(&CallbackMock::callback, &callbackMock));
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.你刚刚节省了我很多时间!谢谢Vlad! (2认同)

Ben*_*Ben 5

我认为这条线错了:

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

最后一个参数应该是 &callbackMock