You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 03:57:42