2016-08-19 4 views
-2

私のクラスの単体テストを書いており、プライベートなメソッドを実行したいと思います。 TESTINGは、私はすべてを公開するために、クラスのシグネチャを変更、定義されている場合C++ユニットテスト:メンバスコープを変更する

class MyClass { 
    Myclass() {} 
    ~MyClass() {} 
#ifdef TESTING 
public: 
#else 
private: 
#endif 
    void MyMethod1(); 
    void MyMethod2(); 
}; 

:私はこのような何かをやっています。

#define TESTING 
#include "MyClass.h" 
void MyTestMethod() 
{ 
    MyClass mc; 
    mc.MyMethod1(); // Now I can access MyMethod1 
} 

私のテストファイル内の唯一の公共だからではなく他の場所:私のテストコードでは、私はちょうどこのような何かを行います。私のテスト実行ファイルには、すべて公開されているクラスを記述するヘッダーがあります。クラスのコードは実際に別の場所に構築されています(TESTINGは定義されていません)。したがって、テストプロジェクトがライブラリにリンクするときにスコープが異なります。

これは何かを破壊する可能性がありますか?私は、ヘッダーが実際にオブジェクトファイルで生成されたものと異なる場合、これがvtablesの場所やコンパイラとリンカの期待値を変更する可能性があることを心配しています。

答えて

0

醜いですが、そうすることはできませんが、代わりにテスト用のラッパークラスを作成し、MyClassのfriend TestClass;キーワードを使用してください。

+0

私はこれを行うと考えましたが、2つのメソッドシグネチャを1つではなく変更する必要があるときに、コードをリファクタリングするのが難しくなります。私が記述した方法では、変更する必要が少なく、維持するクラスが少なくなります。 –

+0

マーティンが指摘したことは、まだこれを行う必要がある場合は100%真です。 MyClassの名前は同じですが異なる名前空間にあり、実装は同じですが異なるアクセス修飾子を持つMyClassの2つのバージョンを作成し、プリプロセッサディレクティブを使用して、正しい名前空間を1行で使用することができます。 –

5

低品質のテストで終わる危険性があります。クラスの実際の機能に関係のない実装の詳細をテストしているテスト。パブリックインターフェイスをテストするだけで、コードリファクタを壊さずに立つことができる、優れたデザインとテストケースに導くことができます。

関連する問題