Чередование EXPECT_CALL () и вызовы фиктивных функций

Документация Google Mock говорит:

Важная заметка: Google Mock требует, чтобы ожидания были установлены до пробные функции вызываются, иначе поведение не определено. В частности, вы не должны чередовать EXPECT_CALL () и вызовы фиктивных функций.

Кто-нибудь знает какие-либо подробности этого ограничения? У меня есть ряд модульных тестов, которые однозначно нарушают это правило, но, похоже, работают нормально.

3

Решение

Как сказано в документации, важно то, что ожидания устанавливаются до вызова метода. Однако это не значит,
что невозможно чередовать EXPECT_CALL и вызов ложного метода. Например, предположим, что у нас есть следующий макет
учебный класс

class MyMock : public bravo::IRealClass
{
public:
...
MOCK_METHOD1(myMethod, bool(int));
...
}

Теперь, предполагая, что вызов метода testMethod звонки myMethod однажды, вы можете написать что-то вроде этого в тесте:

TEST(FooTest, testCaseName)
{
MyMock myMockObj;
...
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(true));
testMethod();
ASSERT_THAT(...);

EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(false));
testMethod();
ASSERT_THAT(...);
}

Это будет хорошо, так как нет вызова myMethod без установленных ожиданий. Однако, если бы вы поменялись местами второго
EXPECT_CALL а также testMethod в псевдокоде выше

EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(true));
testMethod();
ASSERT_THAT(...);

testMethod();
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(false));
ASSERT_THAT(...);

вы входите в сферу неопределенного поведения. Как всегда в случае с неопределенным поведением, возможно, что он не потерпит крах
в некоторых случаях. Однако, если у вас есть что-то подобное в вашем коде, вы должны изменить это.

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector