我很難弄清楚如何模擬單例類,並在另一個類中測試它。目標是驗證來自另一個類(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);
}
我對Google Mock並不熟悉。我可能會關注什麼可以用它來測試,但看起來你不能測試'static'成員函數。請參閱https://groups.google.com/forum/#!topic/googlemock/ixT92RTY350。但是,那是在2012年。今天可能無效。 –
偏題:梅耶斯辛格爾頓可能對你有用。這裏寫的很好:http://stackoverflow.com/a/1008289/4581301 – user4581301
@ user4581301和@R Sahu我被一個同事告知要查看Alias。我正在調查這一點。 – JC203