如何用gmock模拟构造函数和析构函数

How to mock constructors and destructor with gmock

本文关键字:析构函数 构造函数 模拟 何用 gmock      更新时间:2023-10-16

我需要计算构造函数(default/copy/move)和析构函数被调用的次数。我用gmock。我该怎么查?

编辑:感谢马尔科·波波维奇的建议,我会解释我现在有。我有这样一节课,我想用gmock来嘲笑它。我该怎么做?

class A
{
public:
    static int m_calls_to_cons;
public:
    A( )    { m_calls_to_cons++; }
};
int A::m_calls_to_cons;

我使用这个类来检查容器的行为。

首先,您必须指定您需要的内容。实现这一点的方法是定义接口类:

class SpecialFunctionsNotifier
{
public:
    virtual ~SpecialFunctionsNotifier() {}
    virtual void construct() = 0;
    virtual void destruct() = 0;
    virtual void copyConstruct() = 0;
    virtual void copyAssign() = 0;
};

因此,您可以使"default"为null(意思是空的)对象实现:

class SpecialFunctionsNullNotifier : public SpecialFunctionsNotifier
{
public:
    virtual void construct() override {}
    virtual void destruct() override {}
    virtual void copyConstruct() override {}
    virtual void copyAssign() override {}
};

并且,让A使用它:

class A
{
public:
    static SpecialFunctionsNullNotifier m_calls_to_cons_default;
    static SpecialFunctionsNotifier* m_calls_to_cons;
public:
    A( )    { m_calls_to_cons->construct(); }
};
SpecialFunctionsNullNotifier A::m_calls_to_cons_default;
SpecialFunctionsNotifier* A::m_calls_to_cons = &A::m_calls_to_cons_default;

然后,嘲笑这个通知是一项简单的任务:

class SpecialFunctionsNotifierMock : public SpecialFunctionsNotifier
{
public:
    MOCK_METHOD0(construct, void());
    // ..
};

在你的测试中,以这种方式使用:

TEST(ACase, AConstructCount)
{
    SpecialFunctionsNotifierMock callToConsMock;
    A::m_calls_to_cons = &callToConsMock;
    EXPECT_CALL(callToConsMock, construct()).Times(100);
    A a[100];
    // remember to cleanup
    A::m_calls_to_cons = &A::m_calls_to_cons_default;
}