使用CMake v3.19.2、GTest v1.10.0时GMock的EXPECT_CALL::Times()未统计方法调用次数问题
解决GTest Mock未统计到函数调用的问题
这个问题我碰到过好多次啦,根源在于Mock类的成员函数签名和原类不匹配,具体来说是const修饰符的遗漏,咱们一步步来解决:
问题分析
你定义的otherClass::method_to_check是一个const成员函数,但在mockOtherClass里的MOCK_METHOD声明没有加上const修饰符。在C++中,const成员函数和非const成员函数属于不同的函数签名,GMock会严格匹配签名,所以实际调用时,程序会调用父类otherClass的原方法,而不是Mock类的方法,自然就统计不到调用次数了。
修复步骤
1. 修正Mock类的函数签名
修改mockOtherClass中的MOCK_METHOD声明,加上const修饰符,确保和父类的函数签名完全一致:
class mockOtherClass: public otherClass{ public: mockOtherClass( float val ) :otherClass(val) {} // 加上(const)标记,匹配父类的const成员函数 MOCK_METHOD(float, method_to_check, (int), (const)); };
2. 完善EXPECT_CALL的返回值(可选但推荐)
你的测试断言里期望返回值等于val,但如果Mock方法没有指定返回值,GMock会返回一个不确定的默认值(比如float的0.0f),可能导致断言失败。所以最好加上返回值指定:
TEST( test_1, testOther ){ float val{20.00}; mockOtherClass mo{val}; someClass sc(&mo); // 加上WillOnce指定返回值 EXPECT_CALL(mo, method_to_check(testing::_)) .Times(1) .WillOnce(testing::Return(val)); float retVal = sc.method_to_forward( 2 ); ASSERT_EQ(retVal, val); }
验证修复
修改后重新编译运行测试,你会发现:
method_to_check的调用次数会被正确统计为1次- 返回值断言也会顺利通过
内容的提问来源于stack exchange,提问作者Amit kh
相关产品推荐
相关产品推荐

