如何用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
相关产品推荐
相关产品推荐

