C++虚方法Mock失效排查:问题出在哪里?
问题分析与解决
核心问题1:Process函数硬编码创建实例,未做依赖注入
你编写的Process函数是直接在内部创建DataFetcher对象,而非接收外部传入的DataFetcher(或其派生类)实例。这导致测试中创建的MockDataFetcher完全没被Process使用,函数内部仍会实例化原始的DataFetcher,自然会调用真实的GetData实现。
修复方案
修改Process的接口,让它依赖抽象而非具体实现:
// 修改后的Process函数 void Process(DataFetcher& data_fetcher) { // 直接使用传入的实例,不再自行创建 ... const auto& data = data_fetcher.GetData(q); ... }
测试时传入mock对象即可:
TEST_F(ActualLogicTest, BasicOne) { MockDataFetcher mock_data_fetcher(backends_); vector<Data> data; ON_CALL(mock_data_fetcher, GetData).WillByDefault(Return(data)); ... Process(mock_data_fetcher); // 传入mock实例 }
如果不想修改原有接口,也可以引入工厂模式,让Process通过工厂获取DataFetcher实例,测试时替换工厂返回mock对象。
核心问题2:GetData的实现签名与基类不匹配
基类中声明的GetData是const成员函数:
virtual vector<Data> GetData(const vector<string>& q) const;
但你的实现代码遗漏了const修饰:
vector<Data> DataFetcher::GetData(const vector<string>& q) { // 缺少const cout << "Yikes! This was called"; ... }
这会导致基类的虚函数与实现版本签名不一致,相当于你重载了一个新的非const版本GetData,而非重写基类的虚函数。即便解决了依赖注入问题,调用const对象的GetData时仍会走基类逻辑。
修复方案
补全实现的const修饰:
vector<Data> DataFetcher::GetData(const vector<string>& q) const { // 添加const cout << "Yikes! This was called"; ... }
额外问题:backends_未初始化
测试类中的backends_成员未做初始化,而DataFetcher的构造函数需要有效的Backends实例。需在测试的SetUp方法中完成初始化:
class ActualLogicTest : public ... { protected: Backends backends_; void SetUp() override { // 根据Backends的结构完成初始化,比如填充必要成员 backends_ = Backends{/* 初始化参数 */}; } };
内容的提问来源于stack exchange,提问作者Bit Manipulator
相关产品推荐
相关产品推荐

