Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gmock设置默认操作/开\u调用与期望\u调用_C++_Googlemock - Fatal编程技术网

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));

谁能给我解释一下:

  • 两种方法之间的区别
  • 每一个的起伏
  • 什么时候使用它们合适(什么样的设置…)
正如你所说,这两条线做的是完全相同的事情,因此根本没有区别。使用任意一种方式设置默认操作

但是,有一个逻辑上的区别:

  • ON_调用(mock,methodX()).WillByDefault(返回(0x01))
    表示可能会调用该方法,如果发生这种情况,则每次调用都将返回0x01
  • EXPECT_调用(mock,methodX()).willrepeated(Return(0x01))
    表示预期将调用该方法,并且每次调用都将返回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);