无法修改基类A/B时,如何解决GMock重写value方法失效问题?
问题原因
核心问题是A类的value()方法不是虚函数,C++里非虚函数的调用是静态绑定的——编译阶段就确定了B的print()里调用的value()是A的实现,哪怕M类定义了同名的value(),也不会被多态调用。
解决方案
既然不能修改A和B的代码,我们可以在M类中重写print()方法,让它直接调用自己mock的value(),绕开B原有的调用逻辑:
class M : public B { public: MOCK_METHOD(std::string, value, ()); // 重写print方法,替换B的实现 void print(std::string s) override { std::cout << this->value() << s << std::endl; } };
生效逻辑
重写后的print()会直接调用M类自身的value()(也就是你mock的版本),不再走B中调用A的value()的流程。测试时EXPECT_CALL的mock会正常生效,输出会变成M: test mock。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

