Я не понимаю разницу между ON_CALL и EXPECT_CALL при использовании его для
указать действие по умолчанию.
До сих пор я заметил / узнал, что есть два способа настроить действие макета по умолчанию:
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
или же
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
Может ли кто-нибудь объяснить мне:
Между этими двумя утверждениями есть тонкие, но существенные различия. EXPECT_CALL
устанавливает ожидание на макет звонков. Пишу
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
говорит gMock, что methodX
может быть вызван на mock
любое количество раз с любыми аргументами, и когда это так, mock
будет выполнять do_action
, С другой стороны,
ON_CALL(mock, methodX(_)).WillByDefault(do_action);
говорит gMock, что всякий раз, когда methodX
вызывается на 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
с, вам не нужно 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
, Первое ожидание будет полностью проигнорировано в этом случае.
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
Как вы сказали, эти две строки делают одно и то же, поэтому различий нет вообще. Используйте любой способ установить действие по умолчанию, как вам угодно.
Однако есть логическая разница:
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
означает, что метод может быть вызван, и если это произойдет, каждый вызов вернет 0x01EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
означает, что ожидается, что метод будет вызван, и каждый вызов вернет 0x01Кстати, есть Настройка действий по умолчанию в их шпаргалке, которая гласит:
Чтобы настроить действие по умолчанию для определенного метода, используйте ON_CALL ():
ON_CALL(mock_object, method(matchers))
.With(multi_argument_matcher) ?
.WillByDefault(action);