2011-04-27 70 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 

如果DoSomething的調用,foo將呼籲MockA。如何觸發方法bla的調用,以防foo被調用?是否有可能創造一個像這樣的期望:

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

我希望答案很清楚,例子也一樣。

在此先感謝。 沃爾瑪

回答

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

應該工作。如果你必須通過更復雜的參數,使用boost ::綁定(請注意在參數列表中的順序不同類的實例和方法的):

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))); 

而且看一看的谷歌模擬Cheat Sheet wiki page - 它提供了有關功能 - 和方法調用操作的更多信息。

+0

非常感謝你弗拉德。這就是我一直在尋找的。我已經閱讀了gmock的食譜,但CheatSheet更緊湊,更好。再次感謝。 – 2011-04-28 08:59:19

相關問題