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

如何用GTest的MOCK_METHOD测试std::vector参数并存储传入数据?

可以存储传入MOCK_METHOD的vector引用数据

你的思路完全可行,用Google Mock的SaveArg就能实现存储传入的vector引用数据,不过有几个细节需要注意:

  • 调用顺序是关键:必须在被测试代码调用SetData之前设置好EXPECT_CALL,否则SaveArg不会捕获到目标参数。
  • 自动处理引用拷贝:因为SetData的参数是const std::vector<uint8_t>&,SaveArg<0>(&test_data)会自动把引用指向的vector内容拷贝到test_data中,之后你可以安全访问test_data的所有元素。
  • 避免空容器越界:如果被测试代码没有触发SetData调用,test_data会是空容器,此时test_data[0]会引发未定义行为。建议给EXPECT_CALL加上调用次数约束,或者先判断容器非空再访问:
    std::vector<uint8_t> test_data;
    EXPECT_CALL(testClass, SetData(_))
        .Times(1)
        .SaveArg<0>(&test_data);
    
    // 执行被测试逻辑...
    
    ASSERT_FALSE(test_data.empty());
    EXPECT_EQ(test_data[0], 42);
    
  • 替代方案:直接在调用预期中验证:如果不需要存储整个vector,也可以直接用Google Mock的容器匹配器在EXPECT_CALL里验证内容,比如:
    EXPECT_CALL(testClass, SetData(ElementsAre(42, _, _)))
        .Times(1);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:00:59