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

Google Mock中返回unique_ptr引用的单元测试问题求助

解决Google Mock中返回unique_ptr引用的Mock编译错误问题

你的问题核心在于Mock方法返回类型与你提供的对象类型不匹配,以及unique_ptr的类型协变处理不当。让我们一步步拆解并解决:

错误原因分析

  1. 类型不匹配:你的BarMock::getBaz()声明返回std::unique_ptr<BazInterface>&,但你传给ReturnRef的bazMock是std::unique_ptr<StrictMock<BazMock>>类型。虽然StrictMock<BazMock>继承自BazInterface,但std::unique_ptr<Derived>和std::unique_ptr<Base>是完全不同的类型,无法直接隐式转换为引用。
  2. 连锁错误:第一个类型不匹配问题导致bazMock无法正确关联到Mock调用,进而引发第二个编译错误。

解决方案

我们需要调整bazMock的类型,确保它和Mock方法的返回类型一致,同时满足Google Mock对返回引用的要求:

步骤1:修改测试类中的bazMock类型

将bazMock的类型改为std::unique_ptr<BazInterface>,指向StrictMock<BazMock>实例,让它和getBaz()的返回类型完全匹配:

std::unique_ptr<BazInterface> bazMock{std::make_unique<StrictMock<BazMock>>()};

步骤2:修正EXPECT_CALL的返回动作

ReturnRef需要接收一个左值引用,而bazMock作为测试类的成员变量本身就是左值,直接传入即可:

EXPECT_CALL(barMock, getBaz()).WillOnce(ReturnRef(bazMock));

步骤3:调整startMeUp()的Mock调用

因为bazMock现在是std::unique_ptr<BazInterface>,我们需要将其转换回StrictMock<BazMock>类型来设置调用预期:

EXPECT_CALL(*static_cast<StrictMock<BazMock>*>(bazMock.get()), startMeUp());

修改后的完整测试代码

using ::testing::StrictMock; 
using ::testing::ReturnRef; 

class FooTest : public ::testing::Test { 
protected: 
  StrictMock<BarMock> barMock; 
  // 调整为匹配返回类型的unique_ptr
  std::unique_ptr<BazInterface> bazMock{std::make_unique<StrictMock<BazMock>>()}; 
  Foo *foo; 

  virtual void SetUp() { 
    foo = new Foo(barMock); 
  } 

  virtual void TearDown() { 
    delete foo; 
  } 
}; 

TEST_F(FooTest, BasicTest) { 
  EXPECT_CALL(barMock, getBaz()).WillOnce(ReturnRef(bazMock)); 
  // 转换回具体的Mock类型设置调用预期
  EXPECT_CALL(*static_cast<StrictMock<BazMock>*>(bazMock.get()), startMeUp()); 

  foo->operate(); 
}

优化小技巧

如果你不想每次都写static_cast,可以在SetUp中保存一个指向Mock实例的引用:

class FooTest : public ::testing::Test { 
protected:
  // ... 其他成员 ...
  StrictMock<BazMock>& bazMockRef;

  FooTest() : bazMockRef(*static_cast<StrictMock<BazMock>*>(bazMock.get())) {}
};

之后直接用EXPECT_CALL(bazMockRef, startMeUp());即可,代码更简洁。

内容的提问来源于stack exchange,提问作者Pucko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:55:20