Frage

Ich habe das folgende Szenario:

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

Falls Dosen aufgerufen wird, wird Foo auf Mocka gerufen. Wie kann ich einen Aufruf der Methode BLA auslösen, falls Foo aufgerufen wird? Ist es irgendwie möglich, eine Erwartung zu erstellen wie:

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

?

Ich hoffe, die Antwort ist klar und auch das Beispiel.

Danke im Voraus. Mart

War es hilfreich?

Lösung

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

Sollte arbeiten. Wenn Sie komplexere Parameter übergeben müssen, verwenden Sie Boost :: Bind (Beachten Sie die unterschiedliche Reihenfolge der Klasseninstanz und -methode in der Parameterliste):

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

Und wenn foo() Es gibt einige Parameter, die an übergeben werden sollten bla(), verwenden WithArgs:

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

Schauen Sie sich auch das Google Mock an Cheat Sheet Wiki Seite - Es enthält weitere Informationen zu Aktionen für Funktions- und Methodenaufrufe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top