Вызов метода при вызове ожидаемого метода в макете

#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, но контрольная таблица более компактна и лучше. Еще раз спасибо.