2013-07-10 36 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이 경우에는 방법이 없습니다. –