2013-07-10 45 views
2

我有一個帶私有Ctor,Dtor和一個getInstance()方法的Singleton類。使用GMOCK嘲笑一個擁有私有構造函數的類

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來模擬這個類。 有沒有辦法嘲笑它。

+1

單身很難進行單元測試。最好的解決辦法是如果你試圖擺脫它。使它成爲一個普通的類,並將它傳遞給需要它的對象/函數。 –

回答

0

您可以使用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(); 
} 

你一定要確保你之前設置的創造者訪問的實例。否則,將調用默認的創建者函數。

+0

我無法更改源代碼。 – Daemon

+0

@Gaurav在這種情況下,沒有辦法。 –

相關問題