#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
. Так что не стесняйтесь использовать его.