c – 如何在google模拟测试中将值设置为void *参数?

我想将字符串“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();

然后在测试中检查需要检查的内容.

点赞