两种说法之间存在细微但显着的差异。EXPECT_CALL
对模拟电话设定期望。写作
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
告诉 gMockmethodX
可以mock
使用任何参数调用任意次数,并且当它调用时,mock
将执行do_action
. 另一方面,
ON_CALL(mock, methodX(_)).WillByDefault(do_action);
告诉 gMock 无论何时methodX
调用 on mock
,它都应该执行do_action
。该功能在您必须在模拟中编写许多期望并且大多数/全部都必须指定相同操作的情况下很有帮助 - 特别是如果它很复杂。您可以在 中指定该操作ON_CALL
,然后EXPECT_CALL
在不明确指定操作的情况下编写 s。例如,
ON_CALL(mock, Sign(Eq(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is zero"), Return(0)));
ON_CALL(mock, Sign(Gt(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is positive"), Return(1)));
ON_CALL(mock, Sign(Lt(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is negative"), Return(-1)));
现在,如果你必须写很多EXPECT_CALL
s,你不必mock
每次都指定行为:
EXPECT_CALL(mock, Sign(-4, _));
EXPECT_CALL(mock, Sign(0, _));
EXPECT_CALL(mock, Sign(1, _)).Times(2);
EXPECT_CALL(mock, Sign(2, _));
EXPECT_CALL(mock, Sign(3, _));
EXPECT_CALL(mock, Sign(5, _));
在另一个例子中,假设 Sign 返回int
,如果你写
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
该调用mock.Sign(10)
将返回 1,因为ON_CALL
它为由 指定的调用提供了默认行为EXPECT_CALL
。但是如果你写
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
的调用mock.Sign(10, p)
将返回 0。它将与第二个期望相匹配。该期望未指定明确的操作,gMock 将为它生成默认操作。该默认操作是返回返回类型的默认值,即 0 表示int
. 在这种情况下,第一个期望将被完全忽略。