gmock设置默认操作/ ON_CALL与EXPECT_CALL

时间:2012-12-18 12:52:41

标签: c++ googlemock

使用它时,我不明白ON_CALL和EXPECT_CALL之间的区别 指定默认操作。

到目前为止,我注意到/了解到有两种方法可以调整模拟的默认操作:

ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));

有人可以向我解释一下:

  • 两种方法之间的区别
  • 每个人的跌宕起伏
  • 什么时候适合使用它们(什么样的设置......)

4 个答案:

答案 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_CALLEXPECT_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)

在此处查看https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#knowing-when-to-expect-useoncall

基本上有两种用于定义模拟对象行为的构造:ON_CALL和EXPECT_CALL。区别? ON_CALL定义了调用模拟方法时发生的情况,但并不意味着对调用的方法有任何期望。 EXPECT_CALL不仅定义行为,而且还期望在给定的次数(以及指定顺序时也以给定的顺序)下,使用给定的参数调用该方法。

答案 3 :(得分:0)

一个区别是ON_CALL行为(默认行为)和EXPECT_CALL期望的清除方式不同。

https://github.com/google/googletest/blob/master/googlemock/docs/cheat_sheet.md#verifying-and-resetting-a-mock

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定义了默认行为设置,它们也不会在没有实际期望的情况下通过测试。