我如何反复期待一系列电话?

bst*_*r55 6 c++ googletest googlemock

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

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);
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,调用序列非常重要. getFrame(),processFrame()并且releaseFrame()必须按以下顺序进行调用.不幸的是,上面的代码并没有真正实现我想要的.上面的代码允许getFrame()在调用之前重复调用processFrame(),并且对getFrame()after 的调用releaseFrame()被认为是错误,因为它会破坏序列.

有没有办法期望重复进行特定的呼叫序列?我不关心序列执行的次数,只要按顺序调用函数:get,process,release,get,process,release ......

Mac*_*bły 7

您可以在调用模拟(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;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式将其绑定到mock:

EXPECT_CALL(*mMockProcessor, processFrame(_,_))
    .WillRepeatedly(DoAll
        Return(0), 
        Invoke(checkSequenceCorrectness(PROCESS_FRAME)));
Run Code Online (Sandbox Code Playgroud)