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

gtest中EXPECT_CALL的Call(_)作用与工作原理疑问

问题背景

我有一个类MyClass,其私有成员包含一个std::function<void(int)>类型的回调foo,类定义如下:

class MyClass
{
private:
    int val;
    std::function<void(int)> foo;

public:
    MyClass(int p_val, std::function<void(int)> p_foo)
    {
        this->val = p_val;
        this->foo = p_foo;
    }

    void aMethod(int input)
    {
        this->foo(input);
    }
};

为了测试调用aMethod时回调会被执行,我写了如下gtest测试用例:

TEST_F(SomeFixture, MyTest)
{
    const int input;
    ::testing::MockFunction<void(int)> mockCallback;
    EXPECT_CALL(mockCallback, Call(_));

    MyClass object(0, mockCallback.AsStdFunction());  
    object.aMethod(1);
}

测试可以正常运行:如果注释掉测试中的object.aMethod(1)或类中的this->foo(input);,测试会失败。但我不清楚EXPECT_CALL(mockCallback, Call(_))中Call(_)的具体含义及工作机制,仅知道_对应输入参数,想了解其详细作用。


对Call(_)的详细解释
  • Call的本质:::testing::MockFunction<void(int)>是Google Test提供的便捷mock工具类,它会根据你指定的函数签名(这里是void(int))自动生成对应的mock对象,而Call就是这个mock对象里用来接收函数调用的成员方法——它的签名和你传入的模板参数完全一致,也就是接收一个int参数、无返回值。当你通过AsStdFunction()把mock对象转换成std::function<void(int)>后,调用这个std::function本质上就是在调用mock对象的Call方法。

  • _的作用:_是Google Test里的通用参数匹配器,在这里表示“匹配任意int类型的参数”。也就是说,不管aMethod传入的参数是1、100还是其他任何int值,只要mock的Call方法被调用了,不管参数具体是什么,这个期望都会被判定为满足。

  • 整个EXPECT_CALL的工作逻辑:

    1. 当你写下EXPECT_CALL(mockCallback, Call(_))时,相当于给Google Test下达了一个断言指令:我期望mockCallback这个对象的Call方法被调用至少一次,且参数可以是任意int值。
    2. 在测试运行过程中,Google Test会全程监控mockCallback的Call方法的调用情况。
    3. 测试结束时,如果Call方法没有被调用(比如你注释掉了触发调用的代码),Google Test就会判定测试失败;如果Call被调用了(不管参数具体是什么),则断言通过,测试正常结束。

内容的提问来源于stack exchange,提问作者roschach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:48:21