You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:15:57