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

时间:2015-12-29 10:24:23

标签: c++ constructor destructor googletest googlemock

我需要计算调用构造函数(默认/复制/移动)和析构函数的次数。我用gmock。我怎么检查呢?

编辑:感谢Marko Popovic的建议,我将解释我现在的情况。我有一个这样的课,我想用gmock嘲笑它。我怎么能这样做?

class A
{
public:
    static int m_calls_to_cons;

public:
    A( )    { m_calls_to_cons++; }
};

int A::m_calls_to_cons;

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

1 个答案:

答案 0 :(得分:1)

首先,您必须指定您需要的内容。这样做的方法是定义接口类:

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