4


単体テストを容易にするC++コーディングスタイルのベストプラクティスを探しています。問題は、プライベートデータメンバーのモッククラスを実装しようとすることから来ています。プライベートデータメンバーは、クラス内のいくつかの異なるメソッドでアクセスされます。これまでのところ、私が見つけることができるすべての例は、モッククラスを作成する方法を示していますが、実際のオブジェクトとモックオブジェクトの両方を使用するコードを最適に作成する方法は示していません。

以下の例では、タイプMyOtherClassからモックMockMyOtherClassにmCustomを取得する方法がわかりません。私のアプローチは間違っているのではないかと思うので、質問です。

class MyClass {
    MyOtherClass mCustom;
};

[編集]
コンパイラ指令を使用して、新しいコンストラクタを追加しました。

#ifdef UNIT_TESTING
 #include "mock.h"
#else
  #include "myotherclass.h"
#endif

class MyClass {
        MyOtherClass mCustom;
     public:
        MyClass(MyOtherClass pClass) : mCustom(pClass) {}
};
4

3 に答える 3

4

使用できる(必要に応じて組み合わせる)いくつかの異なる戦略があります。

  1. MyOtherClass がかなり基本的な機能を提供し、それ自体が十分にテストされている場合、通常はそれをモックする必要はありません。プロジェクト全体で単体テストを実行するときは、MyOtherClass が MyClass の前にテストされるようにします。

    class MyClass {
    private:
        MyOtherClass mCustom;
    public:
        //...
    };
    
  2. MyClass をテンプレート化して、実際のコードで MyOtherClass を提供し、テスト コードで MyOtherClass のモック バージョンを提供できます。

    template <class T>
    class MyClass_impl {
    private:
        T mCustom;
    public:
        //...
    };
    
    typedef MyClass_impl<MyOtherClass> MyClass; // convenience typedef
    
  3. MyOtherClass をインターフェイス クラスと実装クラスに分割できます。MyClass は、インターフェイス クラスへのポインターのみを格納し、インスタンス化されたときに実装への参照を取得します。

    class MyClass {
    public:
        MyClass(MyOtherClass* aCustom) : mCustom(aCustom) {}
    private:
        MyOtherClass* mCustom;
    public:
        //...
    };
    
  4. ヘッダーの検索パスを使用してトリックを実行できます。これを行うには、別のディレクトリに MyOtherClass のモック バージョンを作成します。次に、単体テストでは、この別のディレクトリで最初にヘッダー ファイルが検索されるようにします。これにより、MyOtherClass のモック バージョンが最初に検出され、MyOtherClass の実際のバージョンがオーバーライドされます。

于 2012-11-06T18:51:46.467 に答える
0

以前にこの問題に直面したとき、私はMyClass2 つのクラスに分割しました。(1) を参照しないジェネリック クラスとMyOtherClass、(2) を使用してテンプレート パラメータをインスタンス化した実装クラスですMyOtherClass。定義の可視性は同じではありませんが、実際の目的にとって重要であるとは思いませんでした。

次に、テストのために、次のようなものを書き、それに応じMyTestOtherClassてインスタンス化しMyClassました。任意の数のモック手法を に適用できMyTestOtherClass、個別のテスト目的で複数のクラスを生成する場合があります。

于 2012-11-06T18:16:13.513 に答える