我试图在里面睡觉。在调用FuncHelper之前。所以我需要类似以下内容:
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(sleep(TimeToSleep)),
Invoke(_mock, &M_MyMock::FuncHelper)));
是否可以使用arg调用sleep().DoAll? C ++ 98是首选。
UPD:
该解决方案基于@Smeeheey的答案并使用C ++ 98。
template <int N> void Sleep ()
{
sleep(N);
}
...
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(Sleep<TimeToSleep>),
Invoke(_mock, &M_MyMock::FuncHelper)));
答案 0 :(得分:3)
既然你说C ++ 98是首选而不是强制性的,那么首先我会给出一个很好的C ++ 11答案:
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs([TimeToSleep](){sleep(TimeToSleep);}),
Invoke(_mock, &M_MyMock::FuncHelper)));
否则(对于C ++ 98),在代码中的其他地方定义包装函数:
void sleepForTime()
{
sleep(TimeToSleep);
}
然后:
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(sleepForTime),
Invoke(_mock, &M_MyMock::FuncHelper)));
请注意,TimeToSleep
必须是全局变量。
编辑:根据OP在评论中提出的建议,如果TimeToSleep
是编译时常量,则可以避免使用全局变量:
template <int Duration>
void sleepForTime()
{
sleep(Duration);
}
...
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(sleepForTime<TimeToSleep>),
Invoke(_mock, &M_MyMock::FuncHelper)));
答案 1 :(得分:1)
如果您更喜欢C ++ 98解决方案,我建议您使用std::bind1st
:
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
.WillOnce(DoAll(InvokeWithoutArgs(std::bind1st(sleep, TimeToSleep)),
Invoke(_mock, &M_MyMock::FuncHelper)));
答案 2 :(得分:1)
定义gmock 动作
ACTION_P(Wait, seconds)
{
::sleep(seconds)
}
然后以简洁的方式使用它:
EXPECT_CALL(...).WillOnce(Wait(3));
我认为这是在gmock测试中等待的最“模样”和最干净的方法,特别是如果一个人需要在测试的多个位置进行等待的话。