【问题标题】:Mocking a class having private Constructor using GMOCK使用 GMOCK 模拟具有私有构造函数的类
【发布时间】:2013-07-10 07:46:16
【问题描述】:

我有一个带有私有Ctor、Dtor 和一个getInstance() 方法的单例类。

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 模拟这个类。 有什么办法可以模拟它。

【问题讨论】:

  • 单例最多很难进行单元测试。最好的解决方案是如果你试图摆脱它。让它成为一个普通的类,并将它传递给需要它的对象/函数。

标签: c++ mocking singleton gmock private-constructor


【解决方案1】:

您可以使用factory pattern 来创建您的对象。

#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();
}

您只需确保访问实例之前设置创建者。否则,将调用默认的创建者函数。

【讨论】:

  • @Gaurav 这样的话,就没有办法了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多