作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在保存模拟接收到的指针参数时遇到困难。
#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/
我是一名优秀的程序员,十分优秀!