考虑某种模拟函数应该多次调用的情况,每次都在某个参数中使用不同的值。我想验证函数确实被调用一次,并且在某个值列表中每个值只调用一次(例如1,2,5)。
另一方面,我想避免定义一个序列,因为这将决定一个特定的顺序,这是一个我希望保持免费的实现细节。
对于这种情况,是否存在某种匹配器或其他解决方案?
我不确定这是否会以任何方式影响解决方案,但我打算在上面的列表中使用不同x值的WillOnce(Return(x))。
答案 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);
满足这些期望。
(旁白:如果您 想要约束订单,则应使用InSequence
:https://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
,那么此功能特别有用。