如何在谷歌模拟测试中将模拟方法的 void * 参数设置为值?

Man*_*yya 5 c++ googlemock

我想将字符串“设备名称”传递给void *方法的指针参数,然后将其检索到字符数组。

为此,我做了如下所示的操作。

在这里,我创建了一个动作来实现这一目标。

ACTION_P(SetArg2ToChar, value) {*static_cast<char*>(arg2) = *value; }
Run Code Online (Sandbox Code Playgroud)

要调用/模拟的实际方法

bool getDictItem(WORD wIndex, BYTE bSubIndex, void * pObjData, DWORD dwLength, CSdo& sdo)
Run Code Online (Sandbox Code Playgroud)

我的模拟方法

  MOCK_METHOD5(getDictItem,
  bool(WORD wIndex, BYTE bSubIndex, void * pObjData, DWORD dwLength, CSdo& sdo));
Run Code Online (Sandbox Code Playgroud)

在代码中它被称为

if( !can.getDictItem(wIndex, bSubIndex, pObjData, dwLength, tSdo) )
Run Code Online (Sandbox Code Playgroud)

我想将一个字符串传递给它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 */
Run Code Online (Sandbox Code Playgroud)

如果我尝试直接使用“SetArgPointee<2>”设置此参数(pObjData),则会收到以下错误。

错误:“void ”不是指向对象的指针类型*

因此我正在尝试ACTION_P

现在通过这个实现,在调用这个模拟对象之后,我只得到变量的第一个字母szDeviceName(进入 this pObjData),即“D”,后跟真实代码流中的 29 个 0。

我想将完整的字符串名称设置到这个void *争论中。

我提到了下面的问题并且到目前为止已经取得了进展。但我无法传递完整的字符串。如何在谷歌模拟中将 void* 参数设置为一组值?

任何与此相关的信息都会有所帮助。

BЈо*_*вић 1

您可以调用函数(或方法)并复制参数,而不是这样做。

测试所在的源文件中类似这样的内容:

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
}
Run Code Online (Sandbox Code Playgroud)

测试中:

EXPECT_CALL( mockCan, getDictItem(_,_,_,_,_) )
            .WillOnce(Call(FakeGetDictItem))
            .RetiresOnSaturation();
Run Code Online (Sandbox Code Playgroud)

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