2012-01-20 16 views
10

私は(テスト用BOOSTフレームワークを使用しますが、モックのために、私はGoogleのモックを使用する必要があります)、私はこのような状況持っているユニットテストの作業を開始しました:だから、Googleのモック単体テスト、静的メソッドC++

class A 
{ 
static int Method1(int a, int b){return a+b;} 
}; 

class B 
{ 
static int Method2(int a, int b){ return A::Method1(a,b);} 
}; 

を、IモッククラスAを作成し、クラスBがAクラスの実際のMethod1を使用せず、モックを使用するようにする必要があります。

これを行う方法がわかりません。同様の例が見つかりませんでした。

+0

私はgmockに慣れていないんだけど、あなただけの 'B.o'と' mockA.o'はリンクできませんでしたか? – Beta

+0

私が知る限り、静的メソッドを扱う方法はいくつかあります。 Method1を仮想にしてクラスBにコンストラクタを追加すると、これはB(A&a):a_in_class_b(a){}のようになり、Method1の呼び出しは次のようになります:a_in_class_b - > Method1(); しかし、別の方法があるかどうか確認したい。 – Jonhtra

答えて

14

あなたはテンプレートにクラスBを変更できます。その後、

template< typename T > 
class B 
{ 
public: 
static int Method2(int a, int b){ return T::Method1(a,b);} 
}; 

とモックを作成します。

struct MockA 
{ 
    static MockCalc *mock; 
    static int Method2(int a, int b){ return mock->Method1(a,b);} 
}; 
class MockCalc { 
public: 
    MOCK_METHOD2(Method1, int(int,int)); 
}; 

すべてのテストの前に、静的なモックオブジェクトMockA::mockを初期化します。

もう1つの方法は、直接A::Method1を呼び出し、クラスBでファンクタオブジェクト(多分std :: function type)を作成し、Method2でそれを呼び出すことです。 MockCalc :: Method1へのコールバックをこのオブジェクトに作成するため、MockAは必要ないため、より簡単です。このような何か:

class B 
{ 
public: 
static std::function< int(int,int) > f; 
static int Method2(int a, int b){ return f(a,b);} 
}; 

class MockCalc { 
public: 
    MOCK_METHOD2(Method1, int(int,int)); 
}; 

し、それを初期化する:

MockCalc mock; 
B::f = [&mock](int a,int b){return mock.Method1(a,b);}; 
+1

ありがとう、これは私が探していた答えでした:) – Jonhtra

+0

@ user1160721この答えがあなたが探しているものならば、左側に "accept answer"ボタンがあるはずです;) –

+0

ええ、私は今それを見ることができます、私はそれをクリックします、私はここで新しいです。私はすべてのユーザーのためのいくつかの評価があり、この "受け入れる答え"がこの評価を増加させることがわかります:) 私はこれに関連するもう一つの同様の質問があります。新しい投稿を投稿するかコメントに尋ねますか? :) – Jonhtra

関連する問題