在调用mock上的预期方法时调用方法

时间:2011-04-27 16:18:43

标签: mocking googlemock expectations

我有以下情况:

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,将在MockA上调用foo。如果调用foo,我怎么能触发方法bla的调用?是否有可能创造一个期望,如:

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

我希望答案很明确,也是一个例子。

提前致谢。 玛特

1 个答案:

答案 0 :(得分:9)

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

应该有效。如果必须传递更复杂的参数,请使用boost :: bind(注意参数列表中类实例和方法的不同顺序):

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 - 它提供了有关函数和方法调用操作的更多信息。