GTest-将Mock函数参数传递给ASSIGN()

时间:2018-12-18 05:26:14

标签: c++ googletest gmock

所以我有一个函数,可以说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中。

我已经成功地使用ACTION宏获取arg4值,但这似乎是很愚蠢的技巧,因此我认为必须有一种更简单的方法。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

一种方法是使用Invoke。如GMOCK - how to modify the method arguments when return type is void

中所述
ProxyReadByPort(arg1, arg2, arg3, arg4) {
   ::testing::Assign(...., arg2);
   return 0;
}

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

BTW,Times(1)和WillRepeatedly()可以工作,但是效果不好,请改用WillOnce。

答案 1 :(得分:0)

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