Может ли gmock имитировать неопределенный метод?

#c #googletest #gmock

#c #googletest #googlemock

Вопрос:

У меня есть тестовый объект, и я хотел бы вызвать EXPECT_CALL метод, который не нужен в реальном объекте, возможно ли имитировать такой неопределенный новый метод?

 struct MockObject {
    MOCK_METHOD2(onRecv, void(void* buffer, size_t len));
};
  

MockObject не наследуется ни от какого другого класса. Поддерживается ли этот вариант использования gmock?

Ответ №1:

Насколько мне известно, то, что у вас здесь есть, является четко определенным поведением. Насколько я могу судить, все, что делает MOCK_METHOD макрос, это подключает прототип метода и другие элементы, необходимые для установки ожиданий. Итак, в то время как MOCK_METHOD семейство макросов находит применение в основном при разработке макетных классов, производных от классов, которые нуждаются в тестировании, ваше фактическое использование само по себе выглядит разумным для меня.

Хотя Google mocks является аккуратным, вы можете легко написать свои собственные методы-макеты с минимальными усилиями, если обнаружите, что кто-то жалуется на это в обзоре кода.

 struct MockObject {
   void onRecv(void* buffer, size_t len) {
        buf_ = buffer;
        len_ = len;
        onRecvCallCount_  ;
   }
   void * buf_;
   size_t len_;
   int onRecvCallCount_ = 0;
};

// actual test setup being
void Setup() {
    mockObject.onRecvCallCount_ = 0
}

// The rest of the assertions/expectations get wrapped inside the 
// if (mockObject.onRecvCallCount_) { } block

  

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