我很难弄清楚如何模拟单例类,并在另一个类中测试它。目标是验证来自单个类(警报)的方法是否从另一个类(CEvnts)调用。
我能够通过消除单例函数成功地测试它,但由于它是遗留代码,我无法改变结构。
在线阅读多篇文章和帖子,我没有找到明确的答案。有谁知道如何为单件类设置Google Test?任何参考文章或文章都可以提供很大的帮助。
Singleton类:
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));
};
Google测试:
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 :(得分:0)
CEvents :: aMethod()在Alarm :: find()返回的实例上调用getType(arg1),它与模拟对象不同。
快速解决方法是将Alarm :: Alarm_Instance的分配移出Alarm :: find()并进入Alarm :: Alarm()。