4

次のシナリオがあります。

クラスInterfaceA;
クラスInterfaceB;
クラスInterfaceC;


クラスInterfaceA
{{
  virtual void foo(InterfaceC&)= 0;
};

クラスInterfaceB
{{
  仮想ボイドbar()= 0;
};

クラスInterfaceC
{{
  仮想ボイドbla()= 0;
};

//モック

クラスMockA:パブリックインターフェイスA
{{
  公衆:
    MOCK_METHOD0(foo、void(InterfaceC&));
};

クラスMockB:パブリックインターフェイスB
{{
  公衆:
    MOCK_METHOD0(bar、void());
};


クラスImplC:パブリックインターフェイスC
{{
  公衆:
    ImplC(InterfaceA&a、Interface&b):m_a(a)、m_b(b){}

    void doSomething(){
      m_a.foo(* this);
    }

    仮想ボイドbla()
    {{
      m_b.bar();
    }
};

MockA mockA;
MockB mockB;

EXPECT_CALL(mockA、foo());

ImplC impl(mockA、mockB);

impl.doSomething(); //mockAでfooを呼び出します

doSomethingが呼び出された場合、MockAでfooが呼び出されます。fooが呼び出される場合、メソッドblaの呼び出しをトリガーするにはどうすればよいですか?次のような期待値を作成することはどういうわけか可能ですか?

EXPECT_CALL(mockA、foo())。WillOnce(Invoke(impl.bla()));

答えが明確で、例もあることを願っています。

前もって感謝します。マート

4

1 に答える 1

12
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ページもご覧ください。関数とメソッドの呼び出しアクションに関する詳細情報が記載されています。

于 2011-04-28T00:56:29.103 に答える