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

