我想将字符串“Device Name”传递给方法的void * pointer参数,稍后将其检索到字符数组.
为此,我已完成如下所示的操作.
在这里,我创建了一个实现此目的的动作.
ACTION_P(SetArg2ToChar, value) {*static_cast<char*>(arg2) = *value; }
要调用/模拟的实际方法
bool getDictItem(WORD wIndex, BYTE bSubIndex, void * pObjData, DWORD dwLength, CSdo& sdo)
我的模拟方法
MOCK_METHOD5(getDictItem,
bool(WORD wIndex, BYTE bSubIndex, void * pObjData, DWORD dwLength, CSdo& sdo));
在代码中它被称为
if( !can.getDictItem(wIndex, bSubIndex, pObjData, dwLength, tSdo) )
我想将一个字符串传递给这个pObjData(列表中的第三个参数).
在我的谷歌测试中,我这样做.
char szDeviceName[30]= {0};
snprintf(szDeviceName, sizeof(szDeviceName), "%s", "Device Name" );
EXPECT_CALL( mockCan, getDictItem(_,_,_,_,_) )
.WillOnce(DoAll(SetArg2ToChar(szDeviceName),
Return(true)))
.RetiresOnSaturation();
/* Call a real method within which this mock method is called */
如果我尝试使用“SetArgPointee< 2>”设置此参数(pObjData)直接,我得到以下错误.
error: ‘void‘ is not a pointer-to-object type*
因此我正在尝试使用ACTION_P
现在有了这个实现,我只得到szDeviceName变量的第一个字母(进入这个pObjData),即在调用这个模拟对象后,实际代码流中的“D”后跟29 0.
我想将完整的字符串名称设置为此void * arguement.
我提到了下面这个问题,并且能够取得进展.但是我无法传递完整的字符串. How to set, in google mock, a void* argument to a set of values?
任何有关此信息都将有所帮助.
最佳答案 而不是这样做,你可以调用一个函数(或方法)并复制参数.
在测试的源文件中有这样的东西:
int invokedPObjData;
bool FakeGetDictItem(WORD wIndex, BYTE bSubIndex, void * pObjData, DWORD dwLength, CSdo& sdo)
{
// copy data. here I assumed it is an int
invokedPObjData = *static_cast< int* >( pObjData );
return true; // or whatever makes sense
}
在测试中:
EXPECT_CALL( mockCan, getDictItem(_,_,_,_,_) )
.WillOnce(Call(FakeGetDictItem))
.RetiresOnSaturation();
然后在测试中检查需要检查的内容.