2012-04-06 6 views
1

私たちのプロジェクトでは、Google Mockを使用していますが、複数の場所では、クラスが「モック可能」であることを確認するためにのみ、プロダクションコードを作成しています。私たちは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にすることはできませんか?あなたが本当に_someBがポインタとして保持したくない場合は、オプションはプリプロセッサコマンドでその宣言をラップすることです

おかげ

+0

スマートポインタを使用してください。 –

+0

@TonyTheLionは、オブジェクトをスタック上に生き残らせることはまだありません。それはまだポインタであり、私はまだセッターが必要です。 –

+1

Googleの依存関係注入のファン。テストフレームワークを使用せずにテストフレームワークを使用するのは難しいことです。 YouTubeのビデオシリーズ「The Clean Code Talks」をチェックすることを強くお勧めします。 http://youtu.be/wEhu57pih5w – cgmb

答えて

1

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

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

あなたはポインタとして_someBを維持するために選択した場合でも、公共のセッターを作成するよりも、おそらくより良いオプションは、テストを直接設定し、アクセス_someBできるようにするためにA年代のテストクラスのフレンドクラスを宣言することです。


これ以外にも、変数名に先頭にアンダースコアを付けるのはconsidered poor formです。

+0

実際にはセッターを回避するには良い方法ですが、それでもクラス内には "特別な"コードが必要です。私はこの問題の完璧な解決策はないと思う。私はこの答えを受け入れるでしょう、それは "合理的な"解決策を与えます。 先頭のアンダースコアコメントをありがとう。私は確かにそのことを覚えています! –

+1

@ W.Goeman:先頭のアンダースコアの問題のフォローアップとして、[Google C++スタイルガイド](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Variable_Names)では、下線。 – User

関連する問題