2017-06-19 16 views
1

私はポリシーデザインパターンを使用してクラスを実装しており、googletest/googlemockを使用してテストする必要があります。例えば。以下のコードでは、class Fooをテストし、class Barのモッククラスを使用したいと考えています。それはGoogleのテストフレームワークを使用してテストすることは可能ですか?(GoogleMock)モッククラスをテンプレートパラメータとして使用する方法

template <typename T> 
class Foo : private T { 
public: 
    void foo() { 
    T::bar(); 
    } 
}; 

class Bar { 
public: 
    void bar() { 
    std::cout << "Hey there!" << std::endl; 
    } 
}; 

int main() { 
    Foo<Bar> f; 
    f.foo(); 
} 

答えて

0

テンプレートをテストするにはgmockを使用できます。 しかし、あなたのようなシナリオでは、モックオブジェクトへの「直接」アクセスがないので、このアクセスを自分で実装する必要があります。モッククラスの静的メンバ変数を使用して - 参照:

class BarMock 
{ 
public: 
    // mocked method 
    MOCK_METHOD0(bar, void()); 

    // code below is needed to keep track of created mock objects: 
    BarMock() { prevIntance = lastInstance; lastInstance = this; } 
    ~BarMock() { lastInstance = prevIntance; } 

    BarMock* prevIntance; 
    static BarMock* lastInstance; 
}; 
BarMock* BarMock::lastInstance = nullptr; 

次に、このような方法でテストすることができます。

Foo<BarMock> objectUnderTest; 
EXPECT_CALL(*BarMock::lastInstance, bar()); 
objectUnderTest.foo(); 
0

テンプレート引数は、民間ベースであるため、それをテストすることはできませんFooテンプレートクラスの

基本クラスへのアクセスを提供する場合(継承を公開に変更する、またはメソッドから継承する)、それは非常に簡単です。モッククラスを作成してテンプレートパラメータとして使用するだけです。テストへ

class BarMock 
{ 
    MOCK_METHOD0(bar, void()); 
}; 

class TestFoo : public Test 
{ 
public: 
    TestFoo() : 
     mock(), 
     m(mock) 
    { 
    } 

    Foo<BarMock> mock; 
    BarMock& m; 
}; 

TEST_F(TestFoo, test_m) 
{ 
    EXPECT_CALL(m, bar()).Times(1); 

    mock.foo(); 
} 
関連する問題