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

如何配置GMock的EXPECT_CALL同时返回值并为指针入参填充数据

解决方案

你可以直接使用::testing::Invoke结合Lambda实现同时填充缓冲区、返回指定值的需求,仅需要修改测试用例中的EXPECT_CALL语句即可。

修改后的测试代码片段

// The Test: Call getdata(), verify sum.
TEST_F(Test_CUT, TestGet)
{
    CUT cut(source);
    static const unsigned char testdata[]={13,21,29,37};

    EXPECT_CALL(*source,getdata(
            ::testing::NotNull(),::testing::Ge(4)
    )).WillOnce(::testing::Invoke([&](void* buf, int max) -> int {
        // 先做缓冲区容量校验,避免越界写入
        if (max < sizeof(testdata)) return -1;
        // 把测试数据拷贝到传入的缓冲区中
        memcpy(buf, testdata, sizeof(testdata));
        // 返回指定的读取长度
        return 4;
    }));

    int sum;
    sum = cut.getandadd();
    EXPECT_EQ(sum,100);
}

原理解释

  • Lambda的入参顺序、类型必须和被Mock的getdata方法的参数完全对应:第一个参数对应getdata的void* buf,第二个对应int max
  • 如果你使用的是不支持Lambda的老版本GMock,可以用ACTION_P自定义Action实现相同效果:
    // 自定义Action定义,放在TEST_F之前即可
    ACTION_P3(FillBufferAndReturn, src_data, data_len, ret) {
        memcpy(arg0, src_data, data_len);
        return ret;
    }
    
    // EXPECT_CALL部分修改为
    EXPECT_CALL(*source,getdata(::testing::NotNull(),::testing::Ge(4)))
      .WillOnce(FillBufferAndReturn(testdata, sizeof(testdata), 4));
    

提示:如果编译提示memcpy未定义,在代码头部增加#include <cstring>即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:15:03