2011-04-27 5 views
3

У меня есть следующий сценарий:Вызов метода, когда ожидается метод на макет был вызван

 
class InterfaceA; 
class InterfaceB; 
class InterfaceC; 


class InterfaceA 
{ 
    virtual void foo(InterfaceC&) = 0; 
}; 

class InterfaceB 
{ 
    virtual void bar() = 0; 
}; 

class InterfaceC 
{ 
    virtual void bla() = 0; 
}; 

// MOCKs 

class MockA : public InterfaceA 
{ 
    public: 
    MOCK_METHOD0(foo, void(InterfaceC&)); 
}; 

class MockB : public InterfaceB 
{ 
    public: 
    MOCK_METHOD0(bar, void()); 
}; 


class ImplC : public InterfaceC 
{ 
    public: 
    ImplC(InterfaceA& a, Interface& b) : m_a(a), m_b(b) {} 

    void doSomething() { 
     m_a.foo(*this); 
    } 

    virtual void bla() 
    { 
     m_b.bar(); 
    } 
}; 

 
MockA mockA; 
MockB mockB; 

EXPECT_CALL(mockA, foo()); 

ImplC impl(mockA, mockB); 

impl.doSomething(); // will call foo on mockA 

В случае йоЗотеЬЫпд вызывается, Foo будет вызван на MockA. Как я могу вызвать вызов метода bla, в случае вызова foo? Можно ли как-то создать такое ожидание, как:

 
EXPECT_CALL(mockA, foo()).WillOnce(Invoke(impl.bla())); 

?

Надеюсь, что ответ ясен и пример тоже.

Заранее спасибо. Mart

ответ

8
EXPECT_CALL(mockA, foo()).WillOnce(InvokeWithoutArgs(&impl, &ImplC::bla)); 

Должно работать. Если вы должны передать более сложные параметры, использовать повышение :: привязку (обратите внимание на различный порядок экземпляра класса и методу в списке параметров):

EXPECT_CALL(mockA, foo()) 
    .WillOnce(Invoke(boost::bind(&ImplC::bla, &impl, other_params))); 

И если foo() даются некоторые параметры, которые должны быть переданы в bla(), используйте WithArgs:

EXPECT_CALL(mockA, foo(Lt(1), _)) 
    .WillOnce(WithArgs<0>(Invoke(&impl, &ImplC::bla))); 

Также посмотрите на Google Mock Cheat Sheet wiki page - это дает больше информации о FUNCTION- и способ вызова действий.

+0

Большое спасибо Владу. Это то, что я искал. Я прочитал Cookbook gmock, но CheatSheet более компактен и лучше. Еще раз спасибо. –