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

如何验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:45:30