Google Mock:按指定顺序重复执行操作

时间:2017-03-10 20:47:55

标签: c++ googlemock

当我们事先不知道对该方法的调用次数时,有人知道如何编写一个google模拟方法来重复执行一系列操作(一次一个)吗?

something like :
EXPECT_CALL(mock, foo())
    .WillRepeatedly(.WillOnce(Return(2));
                    .WillOnce(Return(40));
                    .WillOnce(Return(7)));

行为:

mock.foo(); // return 2
mock.foo(); // return 40
mock.foo(); // return 7

mock.foo(); // return 2
mock.foo(); // return 40
mock.foo(); // return 7

mock.foo(); // return 2
...

由于

1 个答案:

答案 0 :(得分:0)

我已经在评论中提到,编写单元测试并不是一个好主意,因为你无法完全控制或了解那里真正发生的事情。

但无论如何这是可行的 - 例如你可以调用每次调用时产生下一个结果的lambda:

auto valueGenerator = [idx=0, arr={2,40,7}] () mutable
{
    auto result = *std::next(std::begin(arr), idx);
    idx = (idx + 1) % arr.size();
    return result ;
};
EXPECT_CALL(....).WillRepeatedly(Invoke(valueGenerator));

如果你需要检查这是不是在序列中间结束 - 这样做:

int idx = 0;
auto valueGenerator = [&idx, arr={2,40,7}] ()
{
    auto result = *std::next(std::begin(arr), idx);
    idx = (idx + 1) % arr.size();
    return result ;
};
EXPECT_CALL(....).WillRepeatedly(Invoke(valueGenerator));

/// Prossible in TearDown - or at the very end of test:
ASSERT_EQ(0, idx);