sleep()调用gmock的EXPECT_CALL

时间:2016-06-07 12:02:13

标签: c++ unit-testing googletest googlemock

我试图在里面睡觉。在调用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)));

3 个答案:

答案 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测试中等待的最“模样”和最干净的方法,特别是如果一个人需要在测试的多个位置进行等待的话。