GMock中EXPECT_CALL匹配std::any参数编译报错的解决方法问询
解决方案
问题原因
std::any 标准库未提供默认的 operator== 实现,GoogleTest 默认的 TypedEq 匹配器依赖运算符比较,因此编译报错。无需修改原有接口定义,通过自定义 GoogleTest 匹配器即可解决。
方案1:自定义通用 std::any 匹配器(推荐)
先定义可复用的匹配器模板:
MATCHER_P(AnyEquals, expected_val, "") { // 先校验std::any存储的类型是否匹配 if (arg.type() != typeid(expected_val)) { return false; } // 取出值做相等校验 return *std::any_cast<decltype(expected_val)>(&arg) == expected_val; }
修改你的测试代码,替换原有 TypedEq 即可:
MockUObject *mock = new MockUObject(); /// 其他业务代码 EXPECT_CALL(*mock, setProperty( TypedEq<const std::string&>("position"), AnyEquals(std::pair<double, double>(6.0, 2.0)) ));
该匹配器同时支持 const std::any& 和 std::any&& 两种重载的参数校验,无需额外调整。
方案2:通过 Invoke 自定义校验逻辑
如果需要更灵活的校验逻辑,可以直接接住参数自行校验:
EXPECT_CALL(*mock, setProperty( TypedEq<const std::string&>("position"), _ // 先用通配符匹配任意第二个参数 )).WillOnce(Invoke([](const std::string& name, std::any&& value) { // 自行校验类型和值 ASSERT_EQ(value.type(), typeid(std::pair<double, double>)); auto pos = *std::any_cast<std::pair<double, double>>(&value); EXPECT_EQ(pos.first, 6.0); EXPECT_EQ(pos.second, 2.0); }));
内容的提问来源于stack exchange,提问作者Денис Скоморощенко
相关产品推荐
相关产品推荐

