我怎么能反复期待接二连三的电话

How do I repeatedly expect a sequence of calls?

本文关键字:接二连三 电话 期待 怎么能      更新时间:2023-10-16

我正在编写一个测试来验证图像处理线程上的调用顺序。相关的测试代码片段如下所示:

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()必须按此顺序调用。不幸的是,上面的代码并没有真正实现我想要的。上面的代码将允许在调用processFrame()之前重复调用getFrame(),并且在releaseFrame()之后调用getFrame()被认为是错误的,因为它打破了序列。

是否有一种方法可以期望重复进行特定顺序的调用?我不关心序列执行了多少次,只要函数按顺序调用:get, process, release, get, process, release…

您可以在调用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)));