2016-12-19 3 views
2

Из того, что я понимаю gmock (и я новичок в нем) EXPECT_CALL позволяет указать, как будет вести себя метод при его вызове (в этом случае меня больше всего интересует то, вернуть). Но я мог бы точно определить метод явно с его телом. Пример:Определение поведения метода через EXPECT_CALL vs в теле

class Factory 
{ 
    int createSomething(); 
}; 

class MockFactory : public Factory 
{ 
    MOCK_METHOD0(createSomething, int()); 
}; 

int main() 
{ 
    ... 
    int something(5); 
    MockFactory mockFactory; 
    EXPECT_CALL(mockFactory, createSomething()).WillRepeatedly(Return(something)); 
    ... 
} 

против

class MockFactory : public Factory 
{ 
    int createSomething() 
    { 
     return 5; 
    } 
}; 

Теперь, если createSomething были вести себя по-разному (возвращать разные вещи) в различных сценариях, то очевидно, что я должен использовать EXPECT_CALL. Но если он всегда будет возвращать то же самое, не лучше ли просто явно определить тело метода? (Обратите внимание, что другие методы в издеваемом классе могут по-прежнему использовать EXPECT_CALL.)

ответ

1

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

Если вам нужно утверждать в тесте, что вызывается createSomething, вы можете сделать это только в том случае, если вы издевались над ним, а не если у вас есть стандартное определение метода. Не в этом случае, но в случае методов, принимающих параметры, еще лучше иметь макет.

Если вам нужно настроить действие по умолчанию, которое должен выполнять ваш метод, даже если вы не устанавливаете на него никаких ожиданий, сделайте так, используя макрос ON_CALL в функции члена SetUpTestFixture.

Смежные вопросы