Документация Google Mock говорит:
Важная заметка: Google Mock требует, чтобы ожидания были установлены до пробные функции вызываются, иначе поведение не определено. В частности, вы не должны чередовать EXPECT_CALL () и вызовы фиктивных функций.
Кто-нибудь знает какие-либо подробности этого ограничения? У меня есть ряд модульных тестов, которые однозначно нарушают это правило, но, похоже, работают нормально.
Как сказано в документации, важно то, что ожидания устанавливаются до вызова метода. Однако это не значит,
что невозможно чередовать 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(...);
вы входите в сферу неопределенного поведения. Как всегда в случае с неопределенным поведением, возможно, что он не потерпит крах
в некоторых случаях. Однако, если у вас есть что-то подобное в вашем коде, вы должны изменить это.
Других решений пока нет …