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 值,如果为假,则显式删除对象。
我已经在 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 值,如果为假,则显式删除对象。