如何在Google Test中验证可变参数函数panic的调用场景
验证panic是否被调用的实用方案
既然你已经在测试文件里重新定义了panic,不用Google Mock也能轻松验证它的调用情况,核心思路是用全局追踪变量来标记调用状态,具体操作如下:
1. 加个全局追踪标记
在测试文件的全局区域(或者测试类的成员里)定义个静态变量,用来记录panic有没有被调用:
static bool panic_was_called = false; // 要是需要统计调用次数,就换成int类型: // static int panic_call_times = 0;
2. 重写panic函数时更新标记
在测试文件里重新实现panic,进去就把标记改了:
void panic(const char* format, ...) { panic_was_called = true; // panic_call_times++; // 可变参数可以按需处理,只是验证调用的话,这步可省 va_list args; va_start(args, format); // 可选:打印下参数方便调试 va_end(args); }
3. 写测试用例验证
在Google Test的测试用例里,先把标记重置,调用foo之后断言标记的状态:
TEST(FooTest, PanicsWhenStructHasZeroField) { // 构造触发panic的mystruct实例,比如把version设为0 mystruct test_struct = {0, 200, 10}; // 每次测试前重置标记,避免用例互相干扰 panic_was_called = false; // 调用要测的foo函数 foo(); // 断言panic确实被调用了 EXPECT_TRUE(panic_was_called); // 用计数的话就写:EXPECT_EQ(panic_call_times, 1); }
4. 几个要注意的点
- 链接优先级:因为你直接引入了
source.cpp,编译时测试文件里的panic会覆盖原函数,不用额外配置链接选项。 - 状态隔离:如果写多个测试用例,一定要在每个用例开始前重置追踪变量——要是用
TEST_F测试类,就把重置逻辑放到SetUp()方法里,省得每次手动写。 - 验证参数(可选):要是还想检查
panic输出的错误信息对不对,可以在重写的panic里把格式化后的消息存到全局字符串里,之后断言这个字符串的内容。比如定义static std::string last_panic_msg,在panic里把参数格式化进去,测试时断言last_panic_msg符合预期。
内容的提问来源于stack exchange,提问作者Kasko
相关产品推荐
相关产品推荐

