#mocking #googlemock #expectations
#издевательство #googlemock #ожидания
Вопрос:
У меня следующий сценарий:
интерфейс класса; интерфейс класса; интерфейс класса; интерфейс класса { виртуальная пустота foo(InterfaceCamp;) = 0; }; интерфейс класса { панель виртуальной пустоты () = 0; }; интерфейс класса { виртуальная пустота bla() = 0; }; // Издевается макет класса: общедоступный интерфейс { общедоступный: MOCK_METHOD0(foo, void(InterfaceCamp;)); }; макет класса: общедоступный интерфейс { общедоступный: MOCK_METHOD0(bar, void()); }; подразумеваемый класс: общедоступный интерфейс { общедоступный: ImplC(интерфейс amp; a, Interface amp; b) : m_a(a), m_b(b) {} void doSomething() { m_a.foo(*this); } виртуальная пустота bla() { m_b.bar(); } };
Макет, макет; Макет mockB; EXPECT_CALL(макет, foo()); ImplC impl(макет, mockB); impl.doSomething(); // вызовет foo в макете
В случае, если вызывается doSomething , foo будет вызван в макете. Как я могу инициировать вызов метода bla, в случае, если foo будет вызван? Возможно ли каким-либо образом создать ожидание, подобное:
EXPECT_CALL(макет, foo()).WillOnce(Invoke(impl.bla()));
?
Я надеюсь, что ответ ясен, и пример тоже.
Заранее спасибо. Mart
Ответ №1:
EXPECT_CALL(mockA, foo()).WillOnce(InvokeWithoutArgs(amp;impl, amp;ImplC::bla));
Должно сработать. Если вам нужно передать более сложные параметры, используйте boost::bind (обратите внимание на различный порядок экземпляра класса и метода в списке параметров):
EXPECT_CALL(mockA, foo())
.WillOnce(Invoke(boost::bind(amp;ImplC::bla, amp;impl, other_params)));
И если foo()
заданы некоторые параметры, которые должны быть переданы в bla()
, используйте WithArgs
:
EXPECT_CALL(mockA, foo(Lt(1), _))
.WillOnce(WithArgs<0>(Invoke(amp;impl, amp;ImplC::bla)));
Также взгляните на вики-страницу чит-листа Google Mock — она предоставляет больше информации о действиях, вызывающих функции и методы.
Комментарии:
1. Большое тебе спасибо, Влад. Это то, что я искал. Я прочитал кулинарную книгу gmock, но контрольная таблица более компактна и лучше. Еще раз спасибо.