如何使用Google Test的EXPECT_CALL为模块依赖函数编写测试用例
问题诊断
现有测试用例的问题
你的当前测试用例完全无法覆盖Update_user_value的核心逻辑,存在以下明显错误:
- 仅校验了
get_val_module的调用次数,完全没有验证最核心的分支逻辑:即函数是否根据get_val_module的返回值,给update_user_flag传递正确的布尔参数,就算你把if/else分支写反,现有用例也不会报错。 - 无意义声明了
ptr1、ptr2两个指向同一个get_val_module的Mock实例,属于冗余错误。 - 对无参的
get_val_module调用EXPECT_CALL时加了参数匹配符_,属于语法错误,运行时会直接报错。 - 完全没有对被测函数调用的外部依赖
update_user_flag做任何校验,等于核心逻辑没有被测试。
EXPECT_CALL的适用性
EXPECT_CALL完全适合用来校验跨模块调用的参数,Google Mock内置的参数匹配器就是专门用来做这类校验的,也是单元测试隔离被测模块的标准实现方案。
改进测试用例方案
前置准备
你需要先为两个外部依赖函数完成Mock封装:
- 无参函数
get_val_module的Mock - 带布尔参数的
update_user_flag的Mock
此处假设你已经完成封装,对应的Mock实例指针分别为mock_get_val、mock_update_flag。
修正后的测试用例
// 用例1:当get_val_module返回0x1时,update_user_flag被传入true TEST_F(sampletest, setuser_flag_true_when_val_is_0x1) { // 预期get_val_module被调用1次,返回0x1 EXPECT_CALL(*mock_get_val, get_val_module()).Times(1).WillOnce(Return(0x1)); // 核心校验:update_user_flag被调用1次,入参为true EXPECT_CALL(*mock_update_flag, update_user_flag(Eq(true))).Times(1); Update_user_value(); } // 用例2:当get_val_module返回非0x1时,update_user_flag被传入false TEST_F(sampletest, setuser_flag_false_when_val_not_0x1) { // 这里可替换为任意非0x1的返回值,比如0x0、0x2都可以覆盖else分支 EXPECT_CALL(*mock_get_val, get_val_module()).Times(1).WillOnce(Return(0x0)); // 核心校验:update_user_flag被调用1次,入参为false EXPECT_CALL(*mock_update_flag, update_user_flag(Eq(false))).Times(1); Update_user_value(); }
额外优化建议
如果要进一步提升测试覆盖度,可以新增一个边界用例,传入0x2这类非0、非1的返回值,验证else分支的鲁棒性,避免逻辑被错误写成只有返回0时才传入false的问题。
内容的提问来源于stack exchange,提问作者user2986042
相关产品推荐
相关产品推荐

