我正在编写测试来验证图像处理线程上的调用顺序。相关的测试代码如下所示:
Sequence s1, s2;
...
EXPECT_CALL(*mMockVideoSource, getFrame()).InSequence(s2).WillRepeatedly(Return(mFakeBuffer));
EXPECT_CALL(*mMockProcessor, processFrame(_,_)).InSequence(s2).WillRepeatedly(Return(0));
EXPECT_CALL(*mMockVideoSource, releaseFrame(_)).Times(AnyNumber()).InSequence(s2);
...
在这种情况下,通话顺序非常重要。必须按此顺序调用getFrame()
,processFrame()
和releaseFrame()
。不幸的是,上面的代码并没有真正实现我想要的。上述代码允许在调用getFrame()
之前重复调用processFrame()
,并且getFrame()
之后调用releaseFrame()
被视为错误,因为它会中断序列。< / p>
有没有办法期望重复进行特定的呼叫序列?我不关心序列执行的次数,只要按顺序调用函数:get,process,release,get,process,release ......
答案 0 :(得分:7)
您可以在调用mock(https://code.google.com/p/googlemock/wiki/CookBook#Combining_Actions)和某些全局状态(如“lastAction”)时创建辅助操作。
副作用如下:
void checkSequenceCorrectness(ActionType currAction)
{
if (currAction == PROCESS_FRAME) EXPECT_EQ(GET_FRAME, lastAction);
(more ifs)
...
lastAction = currAction;
}
您可以通过以下方式将其绑定到mock:
EXPECT_CALL(*mMockProcessor, processFrame(_,_))
.WillRepeatedly(DoAll
Return(0),
Invoke(checkSequenceCorrectness(PROCESS_FRAME)));