如何验证GoogleMock中传入Mock函数的数组指针所有元素?
解决GoogleMock中捕获数组指针参数内容的问题
问题根源
你误用了SetArrayArgument的作用:这个动作是将你提供的数组内容写入到mock函数的参数指针指向的内存,用于模拟被mock函数修改传入数组的场景,而非把mock函数收到的数组内容复制到你的变量中,方向完全相反。
两种解决方法
方法一:自定义动作复制数组内容
直接在WillOnce里用lambda表达式捕获参数指针,手动复制数组元素到目标变量:
TEST_F(InterfaceTest, TestFuncInterfacePointerArgs) { MockFortranFuncInterfacePointerArgs mock_func_interface; int passed_scalar = 0; int passed_array[3] = {0, 0, 0}; EXPECT_CALL(mock_func_interface, fortran_interface_test_func_pointerargs(testing::_, testing::_)) .WillOnce(testing::DoAll( testing::SaveArgPointee<0>(&passed_scalar), // 自定义lambda动作,复制传入的数组内容 testing::Invoke([&](int*, int* input_arr) { std::copy(input_arr, input_arr + 3, passed_array); }) )); testfunc_pointer(&mock_func_interface); // 用断言验证结果(推荐用断言而非cout) EXPECT_EQ(passed_scalar, 123); EXPECT_THAT(passed_array, testing::ElementsAre(1, 2, 3)); }
方法二:先保存数组指针,再手动复制
先通过SaveArg保存mock函数收到的数组指针,待函数调用完成后复制数组内容:
TEST_F(InterfaceTest, TestFuncInterfacePointerArgs) { MockFortranFuncInterfacePointerArgs mock_func_interface; int passed_scalar = 0; int* received_arr_ptr = nullptr; int passed_array[3] = {0, 0, 0}; EXPECT_CALL(mock_func_interface, fortran_interface_test_func_pointerargs(testing::_, testing::_)) .WillOnce(testing::DoAll( testing::SaveArgPointee<0>(&passed_scalar), testing::SaveArg<1>(&received_arr_ptr) // 保存传入的数组指针 )); testfunc_pointer(&mock_func_interface); // 复制数组内容 std::copy(received_arr_ptr, received_arr_ptr + 3, passed_array); // 断言验证 EXPECT_EQ(passed_scalar, 123); EXPECT_THAT(passed_array, testing::ElementsAre(1, 2, 3)); }
补充说明
EXPECT_THAT配合ElementsAre是GoogleTest中验证数组/容器元素的简洁方式,比逐个编写EXPECT_EQ更高效。- 如果数组元素较多,可使用
memcpy替代std::copy,注意内存大小匹配:memcpy(passed_array, received_arr_ptr, sizeof(passed_array));
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

