Да, это должно быть ошибкой. Одна из политик GoogleMock заключается в том, что в случае возможной неоднозначности лучше выдать ошибку, чтобы заставить пользователя явно заявить о своем намерении.
Добавление макроса EXPECT_CALL
эффективно говорит: «Я забочусь о вызовах этого метода». Всякий раз, когда установлен EXPECT_CALL
, GoogleMock будет пытаться сопоставить все EXPECT_CALL
, которые он видел, в обратном порядке объявления (поэтому самые последние определенные ожидания сопоставляются первыми).
Одна из причин такого дизайна - разрешить переопределение меньшеконкретные ожидания с более конкретными (например, в конструкторе тестового устройства вы устанавливаете менее ограничительные ожидания, но для определенных тестов вы хотите более точно соответствовать). Документация .
Однако есть способ "игнорировать" уже выполненные ожидания, добавив .RetiresOnSaturation()
TEST_F(FooBarTest, OnCallExpectCallSameMethod)
{
Foo foo(barMock);
ON_CALL(barMock, doBar(5)).WillByDefault(testing::Return(true));
EXPECT_CALL(barMock, doBar(7))
.WillOnce(testing::Return(true))
.RetiresOnSaturation();
foo.doFoo();
}
RetiresOnSaturation()
ожидания будут удалены после того, как он будет насыщен (то есть будет вызван столько раз, сколько ожидалось). GoogleMock будет пропускать ожидания, оставшиеся без ответа, до тех пор, пока все еще не будут выбраны ожидания (если все они ушли в отставку, то все равно выдает ошибку).
Если вам, однако, необходимо принимать вызовы doBar(5)
до doBar(7)
, тогда единственный способ сделать это - определить его как ожидание:
TEST_F(FooBarTest, OnCallExpectCallSameMethod)
{
Foo foo(barMock);
EXPECT_CALL(barMock, doBar(5)).WillRepeatedly(testing::Return(true));
EXPECT_CALL(barMock, doBar(7))
.WillOnce(testing::Return(true))
.RetiresOnSaturation();
foo.doFoo();
}
RetiresOnSaturation()
все еще требуется из-за LIFO (последний вв первую очередь) обработка ожиданий.