我有以下情况:

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

如果调用了Dosothing,将在Mocka上调用Foo。如果将调用foo,我该如何触发方法BLA的调用?是否有可能创建一个期望:

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

?

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

提前致谢。市场

有帮助吗?

解决方案

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模拟 作弊表Wiki页面 - 它提供了有关功能和方法调用操作的更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top