考虑某个模拟函数预计会被多次调用的情况,每次都在某个参数中使用不同的值。我想验证该函数确实被调用一次,并且在某个值列表中的每个值(例如 1、2、5)中只调用一次。
另一方面,我想避免定义一个序列,因为这将决定一个特定的顺序,这是一个我想保持自由的实现细节。
这种情况下是否有某种匹配器或其他解决方案?
我不确定这是否会以任何方式影响解决方案,但我确实打算使用 WillOnce(Return(x)) 和上面列表中的每个值不同的 x。
考虑某个模拟函数预计会被多次调用的情况,每次都在某个参数中使用不同的值。我想验证该函数确实被调用一次,并且在某个值列表中的每个值(例如 1、2、5)中只调用一次。
另一方面,我想避免定义一个序列,因为这将决定一个特定的顺序,这是一个我想保持自由的实现细节。
这种情况下是否有某种匹配器或其他解决方案?
我不确定这是否会以任何方式影响解决方案,但我确实打算使用 WillOnce(Return(x)) 和上面列表中的每个值不同的 x。
默认情况下,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/cook_book.md#expecting-ordered-calls-orderedcalls )
如果您希望DoThing
使用许多不同的参数调用函数,您可以使用以下模式:
for (auto const param : {1, 2, 3, 7, -1, 2}){
EXPECT_CALL(foo, DoThing(param));
}
如果您EXPECT_CALL
包含许多参数,其中只有一个正在更改,或者您EXPECT_CALL
包含许多Action
要重复的参数,这将特别有用。