2013-04-16 13 views
9

私のプロジェクトにはCファイルが含まれています。そして、いくつかのファイルでは、静的関数として定義されています。CppUnitでスタティック関数をテストする

私はユニットテストでCppUnitを使用しています。これらの静的関数をテストしたいと思います。私は、ファイルの外側から(それが定義されているところで)関数を呼び出すことは許されないことを知っています。これらの静的関数をC++テストファイルから呼び出すには、この問題を回避するソリューションがありますか?

+0

[プライベートメソッド、フィールド、または内部クラスを持つクラスをテストするにはどうすればよいですか?](https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that -has-private-methods-fields-or-inner-classes) – Raedwald

答えて

6

ここでは、C静的関数について説明していますが、最も簡単な解決方法は、デバッグビルドをコンパイルするときに関数を静的にすることです。これは、シンボルがユニットテストで使用できるようになることを意味します。これは、シンボルのエイリアシングがない場合にのみ機能します。

あなたはすべてのデバッグをシンボルDEBUGを定義した場合、その後のようなもののビルド:

#ifdef DEBUG 
#define debug_export 
#else 
#define debug_export static 
#endif 

をしてから、この

debug_export void foo(void) 
{ 
... 
} 

のいずれかヘッダファイルに条件付きで宣言を含めるようなあなたの静的な関数を定義しますユニットテストファイルで手動でインポートしてください:

extern void foo(void); 

それ以外の方法は、ソースファイル自体に単体テストを含める(手を抜くと混乱する)、機能をテストする(単なるコップアウト)、マークする静的ではなくas dll-local関数を使用して、ユニットテストがその動的オブジェクトの一部であることを確認してください。

+0

ありがとう私はあなたの答えに基づいて解決策に触発しました。詳細は私の答えを見てください – MOHAMED

4

私は自分のプロジェクトのすべてのソースファイルに含まれる共通のヘッダーファイルを持っています。私はこれらの行を追加して問題を解決しました。

#ifdef TEST 
#define static 
#endif 

私の起源のCコードに上記のコードを追加することさえ避けることができます。私はgccコマンドにフラグ-Dstatic=を追加することができました。我々は2つの別々のファイルにstaticとして定義された同じ変数/関数名を持つことができます

  • は、しかし、我々はので、このソリューションを使用するときに注意する必要があります。

  • 静的変数として定義された変数を含む関数を持つことができます。
1

静的メソッドの必要性を取り除くためにコードをリファクタリングする方法はありますか?オブジェクト指向設計の観点から見ると、静態は羊の衣服のグローバルなものです。

必ずしも実用的でも迅速な答えではないと思いますが、それを排除してデザインを改善していきます。

関連する問題