2017-06-19 115 views
1

我已經實現了一個使用策略設計模式的類,我需要使用googletest/googlemock來測試它。例如。在下面的代碼中,我想測試class Foo並且想要爲class Bar使用模擬類。是否有可能使用谷歌測試框架來測試它?如何使用(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(); 
} 
相關問題