GMock测试析构函数调用

时间:2015-01-22 17:04:12

标签: gmock

我已经在Mocking Destructors上阅读了gmock食谱中的部分,但我没有运气让它起作用。我的代码几乎就是文档所说的:

class MockFoo : public Foo {
public:
    MockFoo() {}
    MOCK_METHOD0(destroyMockFoo, void());
    virtual ~MockFoo() { destroyMockFoo(); }
};

TEST_F(DestructorTest, shouldFail) {
    MockFoo* foo = new MockFoo();
    EXPECT_CALL(*foo, destroyMockFoo());
}

但是当我运行代码时,测试通过没有错误。我确实在测试输出结束时得到关于泄漏对象的错误:

DestructorTest.cpp:149: ERROR: this mock object (used in test DestructorTest.shouldFail) should be deleted but never is. Its address is @0x8178790.
ERROR: 1 leaked mock object found at program exit.

但这不是我想要的,也不是文档所说的应该发生的事情。

那么我做错了什么?

3 个答案:

答案 0 :(得分:0)

你没有做错任何事。这里的问题是在模拟对象的析构函数中验证了gmock期望,因此如果从不调用析构函数,那么期望永远不会被验证。这就是你的例子中发生的事情。

解决这个问题的简单方法是明确验证对模拟的期望:

Mock::VerifyAndClearExpectations(foo);

这将为您提供您正在寻找的行为。

答案 1 :(得分:0)

在测试结束时删除foo对象,这样它就不会给对象泄漏。

答案 2 :(得分:0)

为了避免内存泄漏消息,您可以测试Mock :: VerifyAndClearExpectations(foo)的返回值,如果该对象为false,则显式删除该对象。