4

私はGoogleMock1.6 RCを使用していて、モックを作成しようとしていCOM Interfaceます。COMインターフェイスには50近くのメソッドがあり、そのうちのいくつかはベースインターフェイスから継承されます。structこのインターフェイスから継承するモックを作成し、使用しているメソッドのみをモックすると、cannot instantiate abstract classエラーが発生します。

googlemockでこれができるかどうか知りたいです。

4

3 に答える 3

2

できません。すべてのインターフェース(コンストラクターとデストラクタを除く)からすべての純粋仮想メソッドをオーバーロードする必要があります。

于 2011-03-30T07:45:30.223 に答える
2

直接または間接的に、継承元のクラスで純粋な仮想として宣言されているすべてのメソッドをオーバーライドする必要があります。それらすべてをオーバーライドしたくない理由は2つあります。

  1. それらの数が多すぎるので、それらすべてを調べるよりも、自分の時間との関係で何か良いことがあります。
  2. すべてをモックアウトしたモッククラスのコンパイルは遅すぎて、メモリを大量に消費します。

(1)の修正はgmock_gen.py、Googleモックのscriptsディレクトリにあるスクリプトを使用することです。MOCK_METHODクラス定義を調べて、メソッド宣言をステートメントに変換します。(2)で問題が発生した場合は、不要なMOCK_METHODステートメントをスタブに置き換えることができます。

MOCK_METHOD1(f, bool(int i));

virtual bool f(int i) {
  thrown std::exception("The stub for f(int) has been invoked unexpectedly.");
}

例外をスローすると、特定のスタブが呼び出された状況が警告されます。つまり、代わりにそれをモックする必要があります。

編集:モックへの元のインターフェイスがMicrosoftのマクロを使用して記述されている場合、このスレッドには、それらをC++に変換するスクリプトが投稿されていますgmock_gen.py

于 2011-04-01T22:42:08.767 に答える
0

すべてのメソッドをモッククラスでカバーする必要があるかどうかは完全にはわかりません...gmockの例では、たとえばデストラクタがモックされていないことがわかります。したがって、クラス全体をあざける必要はないと思います。

とにかく、モック構造体ではなくモッククラスを作成するべきではありませんか?

ただし、スクリプト/ジェネレーターにはgmock_gen.pyツールがあり、大規模なクラスをモックするという大変な作業を行う必要があります。

于 2011-03-30T06:23:41.627 に答える