如何使用Google Mock模拟模板化方法?

时间:2010-08-06 17:11:07

标签: c++ templates mocking googlemock

我正试图模仿一个模板化的方法。

这是包含模拟方法的类:

class myClass
{
public:
    virtual ~myClass() {}

    template<typename T>
    void myMethod(T param);
}

如何使用Google Mock模拟myMethod方法?

2 个答案:

答案 0 :(得分:8)

在以前版本的Google Mock中,您只能模拟虚拟功能,请参阅项目页面中的documentation

允许使用他们称之为 hi-perf依赖注入的更新版本来模拟non-virtual methods

congusbongus所述:

  

Google Mock依赖于添加成员变量以支持方法模拟,并且由于无法创建模板成员变量,因此无法模拟模板函数

Michael Harrington在评论的googlegroups链接中的解决方法是专门设置模板方法,这些方法将调用可以模拟的普通函数。它没有解决一般情况,但它可以用于测试。

struct Foo
{
    MOCK_METHOD1(GetValueString, void(std::string& value));

    template <typename ValueType>
    void GetValue(ValueType& value); 

    template <>
    void GetValue(std::string& value) {
        GetValueString(value);
    } 
};

答案 1 :(得分:0)

以下是原始帖子,并附有评论以帮助理解:

    struct Foo 
    { 
        // Our own mocked method that the templated call will end up calling.
        MOCK_METHOD3(GetNextValueStdString, void(const std::string& name, std::string& value, const unsigned int streamIndex)); 

        // If we see any calls with these two parameter list types throw and error as its unexpected in the unit under test.
        template< typename ValueType > 
        void GetNextValue( const std::string& name, ValueType& value, const unsigned int streamIndex ) 
        { 
            throw "Unexpected call."; 
        } 
        template< typename ValueType > 
        void GetNextValue( const std::string& name, ValueType& value ) 
        { 
            throw "Unexpected call."; 
        } 

        // These are the only two templated calls expected, notice the difference in the method parameter list. Anything outside
        // of these two flavors is considerd an error.
        template<> 
        void GetNextValue< std::string >( const std::string& name, std::string& value, const unsigned int streamIndex ) 
        { 
            GetNextValueStdString( name, value, streamIndex ); 
        } 
        template<> 
        void GetNextValue< std::string >( const std::string& name, std::string& value ) 
        { 
            GetNextValue< std::string >( name, value, 0 ); 
        } 
    };