如何使用(GoogleMock)模拟类作为模板参数

问题描述:

我已经实现了一个使用策略设计模式的类,我需要使用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(); 
} 

您可以使用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(); 

这是不可能的,以测试它,因为模板参数是一个私有基地的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(); 
}