Gmock установка действий по умолчанию / ON_CALL против EXPECT_CALL

Я не понимаю разницу между ON_CALL и EXPECT_CALL при использовании его для
указать действие по умолчанию.

До сих пор я заметил / узнал, что есть два способа настроить действие макета по умолчанию:

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

или же

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

Может ли кто-нибудь объяснить мне:

  • Разница между двумя методами
  • Взлеты и падения каждого
  • Когда уместно их использовать (что за настройка …)

37

Решение

Между этими двумя утверждениями есть тонкие, но существенные различия. 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_CALLs без указания действия явно. Например.,

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, Первое ожидание будет полностью проигнорировано в этом случае.

39

Другие решения

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

Кстати, есть Настройка действий по умолчанию в их шпаргалке, которая гласит:

Чтобы настроить действие по умолчанию для определенного метода, используйте ON_CALL ():

ON_CALL(mock_object, method(matchers))
.With(multi_argument_matcher)  ?
.WillByDefault(action);
9

По вопросам рекламы [email protected]