gpt4 book ai didi

c++ - 使用 Google Mock 作为指向调用中分配的数组的指针?

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:13 24 4
gpt4 key购买 nike

给定以下 C/C++ 代码:

#define MAX_LEN 256
typedef struct {
int id;
char val[MAX_LEN];
} CfgInfoType;

CfgInfoType* pCfgInfo;

int getCfg(CfgInfoType** ppCfgInfo)
{
int n = determineN(); /* An example, real code a little more complex */
*ppCfgInfo = (CfgInfoType*) malloc(sizeof(CfgInfoType) * n);
/* Code to fill in *pCfgInfo array here */
return n;
}

我不喜欢这段代码,它分配内存作为需要调用者释放的副作用。然而,在我更改代码之前,我想模拟 getCfg() 以便我可以围绕调用者构建一组特征测试。 getCfg() 基本上分配并返回一个指向连续数组的指针。但是我无法设置一个 Google Mock 来为 getCfg() 调用者/客户端填充该数组。此外,调用者释放内存,因此为了测试调用者,模拟实际上必须分配内存或模拟分配的内存,以便 free() 调用不会导致分段违规。尝试了很多东西,其中:

CfgInfoType* pCfgInfo = (CfgInfoType*) malloc(sizeof(CfgInfoType) * 2);
pCfgInfo[0].id = 1;
strcpy(pCfgInfo[0].val, "value 1");
pCfgInfo[1].id = 2;
strcpy(pCfgInfo[1].val, "value 2");

EXPECT_CALL(mockObj, getCfg(NotNull())).WillOnce(DoAll(SetArrayArgument<0>(pCfgInfo, pCfgInfo+2), Return(2));

或:

EXPECT_CALL(mockObj, getCfg(NotNull())).WillOnce(DoAll(SetArgPointee<0>(pCfgInfo), Return(2));

开始认为这是不可行的。或者我应该说不是“可模拟的”?

在此先感谢您的帮助!克里斯

最佳答案

这当然是可行的。您需要的是自定义操作:

ACTION_P(SetCfgInfoPtrToPtr, value)
{
*reinterpret_cast<CfgInfoType**>(arg0) = value;
}

上面的 Action 做了你想要的,但它限制太多,因为指针的类型和参数索引是固定的。我建议使用通用的模板化操作,它允许您通过模板设置类型和参数索引。这可以通过 ACTION_TEMPLATE 实现.第一个模板参数 ( Type ) 是指针类型,第二个 ( uIndex ) 是表示函数参数索引的整数值。里面ACTION_TEMPLATE ,您可以通过 args 访问所有参数,这是一个 std::tuple .因此,我们可以申请std::get结合 uIndex获得正确的函数参数(例如,std::get<0>(args) 给我们 arg0 )。然后我们将此参数转换为 Type** ,取消引用它并将所需的值分配给指针对象。这是一个完整的定义:

ACTION_TEMPLATE(SetArgPtrToPtr, HAS_2_TEMPLATE_PARAMS(typename, Type, unsigned, uIndex), AND_1_VALUE_PARAMS(value))
{
*reinterpret_cast<Type**>(std::get<uIndex>(args)) = value;
}

此操作,以及将分配给指针对象的值。在您的情况下,您应该如何使用它:

EXPECT_CALL(mockObj, getCfg(NotNull()))
.WillOnce(
DoAll(
SetArgPtrToPtr<CfgInfoType, 0>(pCfgInfo),
Return(2)
)
);

关于c++ - 使用 Google Mock 作为指向调用中分配的数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36020528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com