使用Google Test创建C++ Mock遇参数匹配问题及虚函数调用疑问
核心问题分析
你的原始B类中,bar函数是私有成员(C++类默认访问权限为private),这直接导致两个问题:
A::foo无法直接调用b.bar(),私有成员仅允许类内部访问;- 子类
Btest无法override私有虚函数,Google Test的MOCK_METHOD也无法正确生成Mock方法。
正确实现方案
1. 修正基类B的访问权限
将bar设为public(因为A需要调用该方法,若仅允许子类访问可设为protected,但不符合当前场景):
class B { public: virtual void bar() { /* 原实现逻辑 */ }; }; class A { public: void foo(B& b) { b.bar(); } };
2. 编写正确的Mock类
继承B并override public的bar函数,使用Google Test的MOCK_METHOD宏:
#include <gmock/gmock.h> class Btest : public B { public: MOCK_METHOD(void, bar, (), (override)); };
3. 测试用例编写
此时Btest对象可以正常传递给A::foo(子类对象可绑定到基类引用,符合参数要求),还可以设置调用期望:
TEST(A_Foo_Test, CallsBarOnMockB) { A a; Btest b; // 设置期望:bar方法被调用一次 EXPECT_CALL(b, bar()).Times(1); a.foo(b); // 编译正常,实际调用Mock类的bar方法 }
关于向上转型的疑问
不会调用原类的bar方法。C++多态特性决定:当通过基类引用(B&)调用虚函数时,实际执行的是当前绑定的子类对象(Btest)的override方法(即你Mock的版本)。无论显式向上转型(如static_cast<B&>(b))还是隐式传递子类对象给基类引用,都会触发多态调用,执行Mock实现。
内容的提问来源于stack exchange,提问作者Kronephon
相关产品推荐
相关产品推荐

