51

スマート ポインターを返すファクトリがあります。使用するスマート ポインターに関係なく、Google Mock にファクトリ メソッドをモックさせることができません。

モック オブジェクトは、すべてのメソッドが仮想である純粋な抽象インターフェイスの実装です。私はプロトタイプを持っています:

MOCK_METHOD0(Create, std::unique_ptr<IMyObjectThing>());

そして私は得る:

"...gmock/gmock-spec-builders.h(1314): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'"

スマート ポインターでポイントされる型が定義されます。

そして、プライベートと宣言されたコンストラクターの1つにアクセスしようとしていると思いますが、その理由はわかりません。これが std::auto_ptr の場合、コピー コンストラクターがないというエラーが表示され、混乱しました。

とにかく、スマート ポインターを返すメソッドをモックする方法はありますか? または、工場を建設するためのより良い方法はありますか? 生のポインター (blech...) を返す唯一の解決策はありますか?

私の環境は Visual Studio 2010 Ultimate と Windows 7 です。CLI は使用していません。

4

5 に答える 5

101

非 (const) コピー可能関数引数と戻り値に関する Google モック フレームワークの問題に対する実行可能な回避策は、プロキシ モック メソッドを使用することです。

次のインターフェイス定義があるとします (std::unique_ptrこの方法で使用するのが良いスタイルである場合、多かれ少なかれ哲学的な問題のように思われますが、個人的には所有権の譲渡を強制するのが好きです):

class IFooInterface {
public:
    virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) = 0;
    virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() = 0;
    virtual ~IFooInterface() {}
};

適切なモック クラスは次のように定義できます。

class FooInterfaceMock
: public IFooInterface {
public:
    FooInterfaceMock() {}
    virtual ~FooInterfaceMock() {}

    virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) {
        nonCopyableParamProxy(uPtr.get());
    }
    virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() {
        return std::unique_ptr<IMyObjectThing>(nonCopyableReturnProxy());
    }


    MOCK_METHOD1(nonCopyableParamProxy,void (IMyObjectThing*));
    MOCK_METHOD0(nonCopyableReturnProxy,IMyObjectThing* ());
};

nonCopyableReturnProxy()メソッドの構成 (実行されたアクション) が返されるかNULL、ヒープに動的に割り当てられたインスタンスが返されることに注意する必要があります。


このトピックについて議論しているgoogle-mock ユーザー フォーラム スレッドがあり、メンテナーの 1 人が、今後これをサポートするために google-mock フレームワークを変更することはないと述べており、彼らのポリシーは使用std::auto_ptrパラメーターを強く思いとどまらせていると主張しています。前述のように、これは私見であり、哲学的な観点であり、モッキング フレームワークの機能は、設計したいインターフェイスの種類や、サード パーティの API から使用できるインターフェイスを操作するべきではありません。

前述のように、答えは実行可能な回避策を説明しています。

于 2012-07-18T18:41:47.823 に答える
-6

Google Mockでは、ほとんどの場合、モックされたメソッドのパラメータと戻り値をコピー可能にする必要があります。Boostのドキュメントによると、unique_ptrはコピーできません。共有所有権( shared_ptr、linked_ptrなど)を使用するため、コピー可能なスマートポインタクラスの1つを返すオプションがあります。または、生のポインタを使用できます。問題のメソッドは明らかにオブジェクトを構築するメソッドであるため、生のポインターを返すことに固有の問題は見られません。結果をすべての呼び出しサイトの共有ポインターに割り当てる限り、問題はありません。

于 2011-10-01T16:33:27.970 に答える