我有两个纯虚拟函数。
virtual bool IsTypeAllowed(
const std::string& policy,
eType type) const = 0;
virtual bool IsSubTypeAllowed(
const std::string& policy,
const std::string& request) const = 0;
在Mock类中进行模拟,就像这样。
MOCK_CONST_METHOD2(IsTypeAllowed,
bool(const std::string& policy,
eType type));
MOCK_CONST_METHOD2(IsSubTypeAllowed,
bool(const std::string& policy,
const std::string& request));
有期待的调用。
EXPECT_CALL(mock_policy_handler_,
IsTypeAllowed(kPolicy, request_type))
.WillOnce(Return(true));
EXPECT_CALL(mock_policy_handler_,
IsSubTypeAllowed(kPolicy, request_subtype))
.WillOnce(Return(false));
在那里 kPolicy
是 std::string
request_type
是 eType
request_subtype
是 std::string
然后到了调用IsTypeAllowed。
policy_handler.IsTypeAllowed(kPolicy,request_type)
它转到了IsSubTypeAllowed的mock。
我听说如果GMock的名称和签名相同,可能会 "混淆 "函数,而我的情况并非如此,因为函数名称不同。
这是不是一个常见的bug,有什么解决办法吗?
所以在我的例子中,是mock类的基类中的另一个虚拟方法被声明为ifdef,类似于这样。
#ifdef SOME_VARIABLE
virtual void func() = 0;
#endif
导致了vtable中的函数偏移, 在 "SOME_VARIABLE "没有被定义的情况下.
所以这和GMOCK或GTEST无关。