C++ gmock设置默认操作/开\u调用与期望\u调用
我不明白在使用它来 指定默认操作 到目前为止,我注意到/了解到有两种方法可以调整模拟的默认操作:C++ gmock设置默认操作/开\u调用与期望\u调用,c++,googlemock,C++,Googlemock,我不明白在使用它来 指定默认操作 到目前为止,我注意到/了解到有两种方法可以调整模拟的默认操作: ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 或 谁能给我解释一下: 两种方法之间的区别 每一个的起伏 什么时候使用它们合适(什么样的设置…) 正如你所说,这两条线做的是完全相同的事情,因此根本没有区别。使用任意一种方式设置默认操作 但是,有一个逻辑上的区别: ON_调用(mock,methodX()).WillByDefaul
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
或
谁能给我解释一下:
- 两种方法之间的区别
- 每一个的起伏
- 什么时候使用它们合适(什么样的设置…)
表示可能会调用该方法,如果发生这种情况,则每次调用都将返回0x01ON_调用(mock,methodX()).WillByDefault(返回(0x01))
表示预期将调用该方法,并且每次调用都将返回0x01EXPECT_调用(mock,methodX()).willrepeated(Return(0x01))
顺便说一句,他们的备忘单上写着: 要自定义特定方法的默认操作,请使用ON_CALL():
这两种说法之间存在微妙但重大的差异<代码>预期调用设置模拟调用的预期。书写
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
告诉gMock可以使用任何参数对mock
调用methodX
任意次数,当调用时,mock
将执行do\u操作
。另一方面,
ON_CALL(mock, methodX(_)).WillByDefault(do_action);
告诉gMock只要在mock
上调用methodX
,它就应该执行do\u操作。如果您必须在mock上编写许多期望值,并且大多数/所有期望值都必须指定相同的操作,尤其是在复杂的情况下,此功能非常有用。您可以在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)));
在另一个示例中,假设符号返回int
,如果您编写
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
调用mock.Sign(10)
将返回1,因为ON\u call
为EXPECT\u call
指定的调用提供默认行为。但是如果你写
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
调用mock.Sign(10,p)
将返回0。它将与第二个期望相匹配。该期望没有指定显式操作,gMock将为其生成默认操作。默认操作是返回返回类型的默认值,对于int
,该值为0。在这种情况下,第一个期望值将被完全忽略。请参见此处
定义模拟对象的行为基本上有两种构造:ON_调用和EXPECT_调用。区别是什么?ON_CALL定义调用mock方法时会发生什么,但并不意味着对被调用的方法有任何期望。EXPECT_CALL不仅定义了行为,还设置了一个期望,即在给定的次数内(以及在指定顺序时,以给定的顺序)使用给定的参数调用该方法
一个区别是ON_CALL
行为(默认行为)和EXPECT_CALL
期望的清除方式不同
这可以用于在测试的某个时刻清除期望,但仍然保持模拟对象的默认行为。请注意,StrictMock
对象的情况并非如此,因为它们不允许在没有实际期望的情况下通过测试,即使使用ON\u CALL
定义了默认行为设置,但当我尝试用ON\u CALL覆盖先前使用EXPECT\u调用定义的默认操作时,它似乎不起作用。有什么想法吗?@Nicoretti不,它不起作用。我甚至不知道如果你把两者都设置好会发生什么。也许在这种情况下,只有一个会被处决。顺便说一句,gtest解释了如何设置默认行为。是的,我看到了这个,但我感到好奇和困惑,因为EXPECT_调用可以用来修改默认行为。医生也没有说任何关于副作用/优先级的事。。。当使用这两种方法时,mock.Sign(10,p)
为什么不能与EXPECT\u调用(mock,Sign(Gt(0),u)匹配?
?如果是什么优先级规则?是的,后面定义的期望会覆盖前面对匹配调用的期望,如中所述。
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
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);