私はGoogleMock1.6 RCを使用していて、モックを作成しようとしていCOM Interface
ます。COMインターフェイスには50近くのメソッドがあり、そのうちのいくつかはベースインターフェイスから継承されます。struct
このインターフェイスから継承するモックを作成し、使用しているメソッドのみをモックすると、cannot instantiate abstract class
エラーが発生します。
googlemockでこれができるかどうか知りたいです。
私はGoogleMock1.6 RCを使用していて、モックを作成しようとしていCOM Interface
ます。COMインターフェイスには50近くのメソッドがあり、そのうちのいくつかはベースインターフェイスから継承されます。struct
このインターフェイスから継承するモックを作成し、使用しているメソッドのみをモックすると、cannot instantiate abstract class
エラーが発生します。
googlemockでこれができるかどうか知りたいです。
できません。すべてのインターフェース(コンストラクターとデストラクタを除く)からすべての純粋仮想メソッドをオーバーロードする必要があります。
直接または間接的に、継承元のクラスで純粋な仮想として宣言されているすべてのメソッドをオーバーライドする必要があります。それらすべてをオーバーライドしたくない理由は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
。
すべてのメソッドをモッククラスでカバーする必要があるかどうかは完全にはわかりません...gmockの例では、たとえばデストラクタがモックされていないことがわかります。したがって、クラス全体をあざける必要はないと思います。
とにかく、モック構造体ではなくモッククラスを作成するべきではありませんか?
ただし、スクリプト/ジェネレーターにはgmock_gen.pyツールがあり、大規模なクラスをモックするという大変な作業を行う必要があります。