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 で発生しました。 > with 1> [ 1>
Function=void (void) 1> ]

エラーは、boost::bind を含む行に起因します。モック化されたメソッドを void callback(){} に置き換えると、コンパイル エラーがなくなります (ただし、Google Mock の使用もなくなり、目的に反します)。テストされたクラスを変更せずに、私がやろうとしていることは可能ですか?

4

2 に答える 2

17

その理由は、Googleモックモックはコピーできないためです。これは仕様によるものです。値で渡そうとすると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 に答える