使用GMock Mock相同入参个数重载方法时的歧义如何解决?
问题原因
通配符匹配器_本身不携带类型信息,编译器无法判断EXPECT_CALL中要匹配的是PrintValue的哪个重载版本,无法完成重载决议,因此抛出歧义报错。
解决方法
共有三种常用方案可以明确指定匹配的重载版本,消除歧义:
方案1:使用带类型的通用匹配器
An<T>()/A<T>()
这是最简洁的方案,直接在匹配器中声明要匹配的参数类型即可:// 匹配int类型的重载 EXPECT_CALL(mock, PrintValue(An<const int&>())).Times(1); // 若要匹配string类型的重载,修改为: // EXPECT_CALL(mock, PrintValue(An<const std::string&>())).Times(1);方案2:使用
TypedEq<T>()匹配特定参数值
如果需要匹配具体的参数值而非任意值,可以用TypedEq明确指定类型:// 明确匹配传入int类型值42的调用 EXPECT_CALL(mock, PrintValue(TypedEq<const int&>(42))).Times(1);方案3:显式指定函数签名
可以通过强制转换方法指针的方式指定要匹配的重载,适合复杂重载场景,确定性最高:// 显式指定要匹配的是接收const int&、返回void的const成员函数重载 EXPECT_CALL(mock, (static_cast<void (MyClassMock::*)(const int&) const>(&MyClassMock::PrintValue))(_)).Times(1);
将示例代码中的EXPECT_CALL替换为上述任意一种符合需求的写法,即可正常编译运行。
内容的提问来源于stack exchange,提问作者tjwrona
相关产品推荐
相关产品推荐

