C++ GTest-将模拟函数参数传递给ASSIGN()

C++ GTest-将模拟函数参数传递给ASSIGN(),c++,googletest,gmock,C++,Googletest,Gmock,所以我有一个函数,比如WriteHW(value),它通常写入硬件UINT32,但我在模拟。我希望将输入传递给该模拟函数,并将其传递给ASSIGN操作,以便将该值分配给测试本身的局部变量。这样我就可以验证所写入的值(通常通过位操作)是否正确,有点像模拟硬件存储 因此,我的参数4是一个“写入”模拟硬件(regStorage变量)的输入。 基本上我的模拟预期是这样的 EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _))

所以我有一个函数,比如WriteHW(value),它通常写入硬件UINT32,但我在模拟。我希望将输入传递给该模拟函数,并将其传递给ASSIGN操作,以便将该值分配给测试本身的局部变量。这样我就可以验证所写入的值(通常通过位操作)是否正确,有点像模拟硬件存储

因此,我的参数4是一个“写入”模拟硬件(regStorage变量)的输入。
基本上我的模拟预期是这样的

EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _))              
        .Times(1)
        .WillRepeatedly(DoAll(::testing::Assign(&regStorage, WHAT-DO-I-PUT-HERE-TO-GET-ARG4-THAT-CAME-INTO-READ-BY-PORT),::testing::Return(0)));
我正在试图弄清楚我是如何得到进入ReadByPort的arg4的,这样我就可以把它放在Assign的第二个参数中,从而把它放在regStorage中

我已经成功地使用动作宏来获取arg4值,但这似乎真的很愚蠢,所以我认为必须有一种更简单的方法

ACTION(GetWrittenMauiRegister) { return arg4; }
EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _))              // #3
            .Times(1)
            .WillRepeatedly(DoAll(::testing::Assign(&regStorage, (UINT32)GetWrittenMauiRegister),::testing::Return(0)));

谢谢

一个是使用Invoke。。如中所述


顺便说一句,Times(1)和WillRepeatedly()可以工作,但这并不好,请改用WillOnce

我发现解决方案是使用SaveArg(指针),其中N是参数,pointer是要保存参数的变量。

Hmm,我希望有一些直接的方法,而不需要编写一个单独的方法或宏,这是我在谷歌模拟备忘单中遗漏的。如果你的答案真的是最简单的方法,那么在arg0到arg4之间设置动作宏几乎更容易。
ProxyReadByPort(arg1, arg2, arg3, arg4) {
   ::testing::Assign(...., arg2);
   return 0;
}

EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _)
   .WillOnce(Invoke(ProxyReadByPort))