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

如何使用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封装:

  1. 无参函数get_val_module的Mock
  2. 带布尔参数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:27:04