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的工作逻辑:- 当你写下
EXPECT_CALL(mockCallback, Call(_))时,相当于给Google Test下达了一个断言指令:我期望mockCallback这个对象的Call方法被调用至少一次,且参数可以是任意int值。 - 在测试运行过程中,Google Test会全程监控
mockCallback的Call方法的调用情况。 - 测试结束时,如果
Call方法没有被调用(比如你注释掉了触发调用的代码),Google Test就会判定测试失败;如果Call被调用了(不管参数具体是什么),则断言通过,测试正常结束。
- 当你写下
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

