gpt4 book ai didi

C++ 谷歌模拟 SaveArg : how to save a pointer argument

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:50 26 4
gpt4 key购买 nike

我在保存模拟接收到的指针参数时遇到困难。

#define SIZE_OF_DATA

typedef struct {
uint32_t someValue1;
uint16_t someValue2;
// other values here
} LargeStruct;


class SomeClass {
public:
// assume sendData is a generic function where data is actually pointer to a LargeStruct
void sendData(const uint8_t* data, const uint16_t size);
}

class MockClass : public SomeClass {
public:
MOCK_METHOD2(sendData, void(const uint8_t*, const uint16_t));
};

我想将第一个参数保存到 sendData(指针)并查看它指向的数据(它指向一个大结构,所以我不想按值复制):

TEST(SomeFixture, sendData_checkSentDataIsValid) {
MockClass mock;

const uint8_t *pData;
EXPECT_CALL(mock, sendData(_, SIZE_OF_DATA)).WillOnce(SaveArg<0>(&pData));

// do something here that calls sendData()

// hopefully data should point to the same data that was passed in to the method
LargeStruct *ls = (LargeStruct *)pData;

// now verify that the data is ok...
// some expectations here
EXPECT_EQ(SOMEVALUEIWANT, ls->someValue1);

}

但是,pData 指向的数据是错误的——我想我似乎是将指针值保存到结构中,而不是保存指针。

我认为问题在于我传递给 SaveArg 的变量,但我似乎无法在编译版本中获取它并给出正确答案。有什么指点吗?

最佳答案

我刚刚遇到了同样的情况,在我的例子中,我必须确保传递给你的 sendData() 函数的指针没有指向堆栈上的自动变量。否则,当您访问指针时,内容已经改变。我发现这没什么用,所以我决定像这样定义 SaveArg 的自定义替代方案:

ACTION_TEMPLATE(SaveSomeValue1,
HAS_1_TEMPLATE_PARAMS(int, k),
AND_1_VALUE_PARAMS(pointer))
{
const void * data = ::std::tr1::get<k>(args);
const LargeStruct* ls = (const LargeStruct *)data;
*pointer = ls->someValue1;
}

然后你可以像这样使用它:

uint32_t someValue1;
EXPECT_CALL(mock, sendData(_, SIZE_OF_DATA))
.WillOnce(SaveSomeValue1<0>(&someValue1));
//...
EXPECT_EQ(SOMEVALUEIWANT, someValue1);

关于C++ 谷歌模拟 SaveArg : how to save a pointer argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890013/

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