使用它时,我不明白ON_CALL和EXPECT_CALL之间的区别 指定默认操作。
到目前为止,我注意到/了解到有两种方法可以调整模拟的默认操作:
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
或
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
有人可以向我解释一下:
答案 0 :(得分:44)
两种陈述之间存在微妙但重要的差异。 EXPECT_CALL
设置模拟调用的期望值。写
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
告诉gMock methodX
可能会在mock
上使用任何参数多次调用mock
,如果是,do_action
将执行ON_CALL(mock, methodX(_)).WillByDefault(do_action);
。另一方面,
methodX
告诉gMock,在mock
上调用do_action
时,它应该执行ON_CALL
。在您必须在模拟上写下许多期望的情况下,该功能很有用,并且大多数/所有这些都必须指定相同的操作 - 特别是如果它很复杂。您可以在EXPECT_CALL
中指定该操作,然后在不明确指定操作的情况下编写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
现在,如果你必须编写很多mock
s,那么每次都不需要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, _));
指定行为:
int
在另一个例子中,假设Sign返回ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
,如果你写
mock.Sign(10)
调用ON_CALL
将返回1,因为EXPECT_CALL
为EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
指定的调用提供默认行为。但是如果你写的话
mock.Sign(10, p)
int
的调用将返回0.它将与第二个期望匹配。该期望指定没有明确的操作,gMock将为其生成默认操作。该默认操作是返回返回类型的默认值,{{1}}为0。在这种情况下,第一个期望将被完全忽略。
答案 1 :(得分:10)
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
正如你所说,这两条线完全相同,因此根本没有差异。您可以使用任一方式设置默认操作。
但是,存在逻辑差异:
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
表示可能会调用该方法,如果发生这种情况,则每次调用都将返回0x01 EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
表示预计将调用该方法,并且每次调用都将返回0x01 顺便说一下,他们的备忘单上有一个Setting default actions,上面写着:
要自定义特定方法的默认操作,请使用ON_CALL():
ON_CALL(mock_object, method(matchers))
.With(multi_argument_matcher) ?
.WillByDefault(action);
答案 2 :(得分:1)
基本上有两种用于定义模拟对象行为的构造:ON_CALL和EXPECT_CALL。区别? ON_CALL定义了调用模拟方法时发生的情况,但并不意味着对调用的方法有任何期望。 EXPECT_CALL不仅定义行为,而且还期望在给定的次数(以及指定顺序时也以给定的顺序)下,使用给定的参数调用该方法。
答案 3 :(得分:0)
一个区别是ON_CALL
行为(默认行为)和EXPECT_CALL
期望的清除方式不同。
using ::testing::Mock;
...
// Verifies and removes the expectations on mock_obj;
// returns true if and only if successful.
Mock::VerifyAndClearExpectations(&mock_obj);
...
// Verifies and removes the expectations on mock_obj;
// also removes the default actions set by ON_CALL();
// returns true if and only if successful.
Mock::VerifyAndClear(&mock_obj);
这可以用来清除测试中的期望值,但仍保留模拟对象的默认行为。请注意,StrictMock
对象不是这种情况,因为即使使用ON_CALL
定义了默认行为设置,它们也不会在没有实际期望的情况下通过测试。