GMock 测试析构函数调用

GMock testing destructor calls

我已经在 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.

但这不是我想要的,也不是医生所说的应该发生的。

那么哪里做错了?

你一定没有做错任何事。这里的问题是 gmock 预期是在模拟对象的析构函数中验证的,因此如果从未调用析构函数,则永远不会验证预期。这就是您的示例中发生的情况。

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

Mock::VerifyAndClearExpectations(foo);

这将为您提供所需的行为。

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

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