1

私たちのプロジェクトでは Google Mock を使用していますが、クラスが「モック可能」であることを確認するためだけに、プロダクション コードの複数の場所で構造を作成しています。これを行うのは、Google Mock のメリットを享受したいからですが、反対に、より最適な製品コードを使用したいからです。次のケースは私たちがよくすることであり、取り除きたいと考えています。

class A{
  public:
    void doSomething(); //Does something with _someB
    void setSomeB(B* mockedB); //This is only here for GMock
  private:
    B* _someB; //This should not be a pointer, it is a pointer only for GMock
}

ご覧のとおり、これは単純化された例にすぎません。詳細は省きました。基本的に、B がポインターであることを取り除きたいと考えています。これをポインターとして使用する理由は、テスト コードで B をサブクラス化 (モック) し、そのセッターで設定できるからです。

これを回避する方法はありますか?B をクラス内でスコープすることはできませんか?

ありがとう

4

1 に答える 1

1

本当にポインタとして保持されたくない場合は_someB、その宣言をプリプロセッサコマンドでラップするオプションがあります。

#ifdef MOCK_TEST
    B _someB;
#else
    MockB _someB;
#endif

_someBそうしないと、モックオブジェクトのインスタンスではないため、gmockの期待値やアサーションをに配置する簡単な方法はありません。これの醜さは別として、それはまた、Class A常駐するlibを2回コンパイルする必要があるという欠点もあります。1回はMOCK_TEST定義済みで、もう1回は定義なしです。ただし、のセッターは不要です_someB

ポインタとして保持することを選択した場合でも_someB、パブリックセッターを作成するよりも、テストクラスをのフレンドクラスとして宣言してA、テストを直接設定してアクセスできるようにすることをお勧めします_someB


余談ですが、変数に先頭にアンダースコアを付けるのは不適切な形式と見なされることがよくあります。

于 2012-04-06T19:37:25.933 に答える