谷歌模拟单例C++类

Google Mock a Singleton C++ Class

本文关键字:C++ 单例 模拟 谷歌      更新时间:2023-10-16

我很难弄清楚如何模拟单例类,并在另一个类中测试它。目标是验证来自单一实例类 (警报( 的方法是否从另一个类 (CEvnt( 调用。

我能够通过消除单例函数成功测试这一点,但由于它是遗留代码,我无法更改结构。

在网上浏览了几篇文章和帖子,我还没有找到明确的答案。有谁知道如何为单例课程设置 Google 测试?任何参考资料或文章都可以提供很大的帮助。

单例类:

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);
}

CEvents::aMethod(( 在 Alarm::find(( 返回的实例上调用 getType(arg1(,这将与您的模拟对象不同。

一个快速的解决方法是将 Alarm::Alarm_Instance 的分配从 Alarm::find(( 移到 Alarm::Alarm(( 中。