如何在C++单元测试中检测析构函数内调用的函数?
问题分析与修复方案
这个测试失败的核心原因在于基类析构函数的调用方式破坏了虚函数的多态特性。
问题根源拆解
你在FooClass的析构函数里写了FooClass::fooFunction()——这种带类名限定的调用会直接绑定到基类的fooFunction实现,完全绕过了虚函数的动态绑定机制。哪怕你在子类MockFooClass里用GMock重写了这个虚方法,当销毁对象时,析构函数依然只会调用基类的空实现,根本不会触发你设置的EXPECT_CALL断言。
修复方案
方案1:修正基类析构函数的调用方式
把基类析构里的FooClass::fooFunction()改成直接调用fooFunction(),让虚函数的动态绑定生效:
class FooClass { public: ~FooClass(){ fooFunction(); } // 去掉类名限定,触发多态调用 virtual void fooFunction() {} };
修改后,当销毁MockFooClass对象时,析构过程中会通过虚函数表找到子类的mock实现,你的EXPECT_CALL就能正确触发,测试也就会通过了。
方案2:简化测试代码的内存管理
你当前用new和delete手动管理mock对象的内存,其实可以简化为栈上创建对象(对象离开作用域时自动析构),代码更简洁还能避免内存泄漏:
TEST(DumbTest, blabla) { MockFooClass mock; EXPECT_CALL(mock, fooFunction()); // 无需手动delete,函数结束时mock自动销毁 }
内容的提问来源于stack exchange,提问作者Thomas Benard
相关产品推荐
相关产品推荐

