Google Mock:对具有不同参数的相同功能的多重期望

时间:2011-04-21 11:05:50

标签: googlemock

考虑某种模拟函数应该多次调用的情况,每次都在某个参数中使用不同的值。我想验证函数确实被调用一次,并且在某个值列表中每个值只调用一次(例如1,2,5)。

另一方面,我想避免定义一个序列,因为这将决定一个特定的顺序,这是一个我希望保持免费的实现细节。

对于这种情况,是否存在某种匹配器或其他解决方案?

我不确定这是否会以任何方式影响解决方案,但我打算在上面的列表中使用不同x值的WillOnce(Return(x))。

2 个答案:

答案 0 :(得分:10)

默认情况下,gMock的期望可以按任何顺序得到满足(正是因为你提到的原因 - 所以你不要过度指定你的测试)。

在你的情况下,你只需要像:

EXPECT_CALL(foo, DoThis(1));
EXPECT_CALL(foo, DoThis(2));
EXPECT_CALL(foo, DoThis(5));

等等:

foo.DoThis(5);
foo.DoThis(1);
foo.DoThis(2);

满足这些期望。

(旁白:如果您 想要约束订单,则应使用InSequencehttps://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#expecting-ordered-calls

答案 1 :(得分:0)

如果您希望使用许多不同的参数调用函数DoThing,则可以使用以下模式:

for (auto const param : {1, 2, 3, 7, -1, 2}{
    EXPECT_CALL(foo, DoThing(param));
}

如果您的EXPECT_CALL包含许多参数,其中只有一个参数正在发生变化,或者您的EXPECT_CALL包含许多要重复的Action,那么此功能特别有用。