2017-03-10 39 views
2

Googleテストを使用して、別のクラスメソッドを呼び出すといくつかのクラスメソッドが呼び出されることを確認したいと思います。Google Testを使用したクラスメソッドの呼び出しの確認

#include "gtest/gtest.h" 

class Foo { 

    void DoWorkPrivate(int i) {} 

public: 

    void DoWork(int i) {} 

    void Run() { 
     for (int i = 1; i <= 5; i++) { 
      DoWork(i); 
      DoWorkPrivate(i); 
     } 
    } 
}; 

TEST(FooTest, Run) { 
    Foo foo;  
    foo.Run(); // Need to check that DoWork() and DoWorkPrivate() are invoked 
} 

QUESTION:

DoWork()DoWorkPrivate()は、特定のパラメータ(1、2、3、4、5)で5回呼び出されることを確認する方法は?

答えて

2

この場合の通常の方法は、モックオブジェクトを作成することです。模倣とさまざまなタイプの模擬試験に関する文献や記事がたくさんあります。だから私はここで詳しくは深くは触れません。例えばfowler about mocking

しかし、一般的に、クラス(または通常はクラスのインターフェイス)をサブクラス化することができます。メソッド呼び出しが必要です。あなたの例するための手段

class FooMock : public Foo { 
    public: 
    bool isDoWorkPrivateCalled() { 
    return isDoWorkPrivatecall; 
    } 

    private: 
    DoWorkPrivate(int i) { isDoWorkPrivatecall = true;} 
    bool isDoWorkPrivatecall = false; 
} 


TEST(FooTest, Run) { 
    Foo *foo = new FooMocK();  
    foo->Run(); 
    EXPECT_TRUE(foo->isDoWorkPrivateCalled()); 
} 

そしてYES、それはプライベートメソッドを保護する必要があることを意味します。

少なくとも私はgmockを使用することをお勧めします。 mocking-frameworkはモックの特徴でgtestを拡張します。 gmockを使用すると、メソッドに

MOCK_METHOD1(DoWorkPrivate, void(int i)); 

を模擬可能性次に、あなたの特定のケースでは、テストは次のようになります。

EXPECT_CALL(foo, DoWorkPrivate(1)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(2)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(3)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(4)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(5)).Times(1); 
+1

最後のコードへの私の変更は、質問に対する本当の答えです。) –

+0

ええOK。私の元の答えは彼の特定の質問に簡単に移すことができたと思った。 ;-) – Soeren

0

DoWork()およびDoWorkPrivate()が特定のパラメータ(1,2,3,4,5)で5回呼び出されたことを確認する方法はありますか?

私は、次を考えることができます:

  1. は、副作用を紹介します。グローバル変数の値をインクリメントさせたり、ファイルに何かを書き込ませるようにしてください。副作用を追跡することで、呼び出された回数を測定できます。

  2. 関数に渡す変数の値をインクリメントさせます。渡された変数の変更を追跡することで、呼び出された回数を測定できます。

PS私は知りませんがあるかもしれない他のメカニズム。

関連する問題