Google Mock中返回unique_ptr引用的单元测试问题求助
解决Google Mock中返回
unique_ptr引用的Mock编译错误问题 你的问题核心在于Mock方法返回类型与你提供的对象类型不匹配,以及unique_ptr的类型协变处理不当。让我们一步步拆解并解决:
错误原因分析
- 类型不匹配:你的
BarMock::getBaz()声明返回std::unique_ptr<BazInterface>&,但你传给ReturnRef的bazMock是std::unique_ptr<StrictMock<BazMock>>类型。虽然StrictMock<BazMock>继承自BazInterface,但std::unique_ptr<Derived>和std::unique_ptr<Base>是完全不同的类型,无法直接隐式转换为引用。 - 连锁错误:第一个类型不匹配问题导致
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
相关产品推荐
相关产品推荐

