Domanda

Ho il seguente scenario:

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

Nel caso in cui doSomething viene invocato, foo sarà chiamata Mocka. Come posso scattare un'invocazione del metodo bla, nel caso in cui foo verrà invocato? E 'in qualche modo possibile creare un'aspettativa come:

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

Spero che la risposta è chiara e l'esempio troppo.

Grazie in anticipo. Mart

È stato utile?

Soluzione

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

Il lavoro dovrebbe. Se si deve passare parametri più complessi, l'uso boost :: bind (si noti il ??diverso ordine dell'istanza di classe e metodo nella lista dei parametri):

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

E se foo() è dato alcuni parametri che devono essere passati in bla(), uso WithArgs:

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

Anche dare un'occhiata al Google Mock pagina Foglio wiki cheat -. fornisce ulteriori informazioni sulle azioni e della funzione metodo chiamante

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top