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

相关问题