Google Mock是Singleton C ++类

时间:2017-04-13 20:53:59

标签: c++ unit-testing singleton googletest gmock

我很难弄清楚如何模拟单例类,并在另一个类中测试它。目标是验证来自单个类(警报)的方法是否从另一个类(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);
}

1 个答案:

答案 0 :(得分:0)

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

快速解决方法是将Alarm :: Alarm_Instance的分配移出Alarm :: find()并进入Alarm :: Alarm()。