9

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

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

这种情况下是否有某种匹配器或其他解决方案?

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

4

2 回答 2

14

默认情况下,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/cook_book.md#expecting-ordered-calls-orderedcalls )

于 2011-05-05T15:03:18.720 回答
3

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

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

如果您EXPECT_CALL包含许多参数,其中只有一个正在更改,或者您EXPECT_CALL包含许多Action要重复的参数,这将特别有用。

于 2018-01-24T16:18:46.167 回答