2

プライベート Ctor、Dtor、および 1 つの getInstance() メソッドを持つ Singleton クラスがあります。

class Single {
public:
virtual void* alloc(size_t size, uint line){}
Single* getInstance() {
if(!m_Instance)
        m_Instance = __OSAL_NEW OSAL_Memory;
    return m_Instance;
}
private:
Single();
~Single();
static Single* m_Instance;
};


#define Allocate(size_t size)\
(Single::getInstance())->alloc(size, __LINE__)

GMOCK を使用してこのクラスをモックする必要があります。それを嘲笑する方法はありますか。

4

1 に答える 1

0

ファクトリ パターンを使用してオブジェクトを作成できます。

#include <iostream>
#include <functional>

struct A
{
    virtual ~A(){}

    virtual void foo() = 0;
};

struct Areal : A
{
    virtual void foo(){
        std::cout<<"real"<<std::endl;
    }
};

struct Amock : A
{
    virtual void foo(){
        std::cout<<"mock"<<std::endl;
    }
};

struct Single
{
    typedef std::function< A*() > CreatorFn;

    static A* getInstance(){
        if ( ! instance() )
            instance() = (create())();
        return instance();
    }

    static void setCreator( CreatorFn newFn ){
        create() = newFn;
    }

private:

    static CreatorFn& create(){
        static CreatorFn f( [](){return new Areal;} );
        return f;
    }
    static A*& instance(){
        static A* p=nullptr;
        return p;
    }
};


bool useMock = true;

int main()
{
    if ( useMock )
    {
        Single::CreatorFn mockFn( [](){ return new Amock; } );
        Single::setCreator( mockFn );
    }

    Single::getInstance()->foo();
}

インスタンスにアクセスするに作成者を設定する必要があります。それ以外の場合は、デフォルトのクリエーター関数が呼び出されます。

于 2013-07-10T08:04:11.037 に答える