我正在尝试在FunCHelper之前在.WillOnce内进行一些 sleep 。所以我需要类似于以下内容:

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1)
  .WillOnce(DoAll(InvokeWithoutArgs(sleep(TimeToSleep)),
                  Invoke(_mock, &M_MyMock::FuncHelper)));

是否可以在.DoAll内部使用arg调用sleep()? 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)));

最佳答案

既然您说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)));

关于c++ - 在gmock的EXPECT_CALL中进行sleep()调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37678844/

10-13 04:58