2017-04-13 102 views
1

我很難弄清楚如何模擬單例類,並在另一個類中測試它。目標是驗證來自另一個類(CEvnts)的來自單例類(Alarm)的方法。Google模擬一個單例類C++類

我能夠通過消除單例函數來成功地進行測試,但由於它是遺留代碼,因此我無法更改結構。

在線閱讀多篇文章和文章,我還沒有找到明確的答案。有誰知道如何爲單身課程設置Google Test?任何參考文獻或文章都可能是一大幫助。

單例類:

class Alarm 
{ 
public: 
    Alarm(); 
    virtual ~Alarm(); 

    // Singleton 
    static Alarm* find(void) 
    { 
     if (!Alarm_Instance) 
     { 
      Alarm_Instance = new Alarm(); 
     } 
     return Alarm_Instance; 
    } 

    // Member methods 
    virtual ENUM_TYPE getType(ENUM_TYPE ENUM_ARG); 

private: 
    static Alarm* Alarm_Instance; 
}; 

ENUM_TYPE Alarm::getType(ENUM_TYPE ENUM_ARG) 
{ 
    return aMatch[ENUM_ARG].aType; 
} 

模擬:

class Alarm_Mock : public Alarm 
{ 
public: 
    Alarm_Mock(); 
    virtual ~Alarm_Mock(); 

    MOCK_METHOD1(getType, ENUM_TYPE(ENUM_TYPE ENUMONE)); 
}; 

谷歌測試:

class Ev_test: public testing::Test 
{ 
    void SetUp() 
    { 
     mpsEV= new CEvents(); 
     ON_CALL(msMock, getType(_)).WillByDefault(Return(SOME_ENUM)); 
    } 

    void TearDown() 
    { 
     delete mpsEV; 
    } 

protected: 
    Alarm_Mock msMock; 
    CEvents* mpsEV; 
}; 

TEST_F(Ev_test, testGetFunctions) 
{ 
    EXPECT_CALL(msMock, getAlarmType(_)) 
      .Times(1); 

    mpsEV->aMethod(arg1, arg2, arg3, arg4); 
} 

類方法來測試 - 不從的getType類報警被調用?:

void CEvents::aMethod(arg1, arg2, arg3, arg4) 
{ 
    Alarm::find()->getType(arg1); 
} 
+0

我對Google Mock並不熟悉。我可能會關注什麼可以用它來測試,但看起來你不能測試'static'成員函數。請參閱https://groups.google.com/forum/#!topic/googlemock/ixT92RTY350。但是,那是在2012年。今天可能無效。 –

+1

偏題:梅耶斯辛格爾頓可能對你有用。這裏寫的很好:http://stackoverflow.com/a/1008289/4581301 – user4581301

+0

@ user4581301和@R Sahu我被一個同事告知要查看Alias。我正在調查這一點。 – JC203

回答

0

CEvents :: amethod方法()對報警返回的實例調用的getType(ARG1):: find()方法,這將是不同的從你的模擬對象。

快速解決方法是將Alarm :: Alarm_Instance的分配從Alarm :: find()移出並進入Alarm :: Alarm()。

+0

不會讓我的班級不再是單身人士嗎? – JC203

+0

@ JC203它比現在更像一個單身人士。你有一個公共的構造函數,用戶可以跳過工廠方法,創建額外的實例沒有限制(例如新的)。如果靜態單例指針已經不是NULL,則可以避免將此賦值添加到構造函數並引發異常。 –