模板化模拟类中缺少MOCK_METHODx() 定义'typename'

'typename' missing for MOCK_METHODx() definitions in templated mock class

本文关键字:定义 typename METHODx 模拟类 MOCK      更新时间:2023-10-16

我有一个编译器错误问题,gmock和一个模板化的模拟类应该被用作派生(具体)模拟类的基。

目的是测试框架支持的回调方法,但框架基类依赖于最终实现(简而言之,它是一个注入静态接口声明的CRTP模式风格框架)-

我正试图勾勒出我所拥有的(请不要在第一次尝试中依赖可编译代码):

这是框架钩子接口定义,依赖于上下文模板参数,框架基类本身将其作为非多态调用处理,并提供默认实现:

template<class Context>
class IFrameworkHooks
{
public:
    virtual void funcImpl(Context* context) = 0;
    virtual ~IFrameworkHooks() {}
};

现在我想实现一个模拟类,实现IFrameWorkHooks<>接口:

template<class Context, class InnerInterface>
class MyTemplateMock
: public FrameworkBaseClass<MyTemplateMock<Context,InnerInterface>,Context,InnerInterface>
, public IFrameworkHooks<Context>
{
public:
    // Compiler error here:
    MOCK_METHOD1(funcImpl, void (Context* context));
    virtual ~MyTemplateMock() {}
protected:
    MyTemplateMock()
    {
        // Compiler error here:
        ON_CALL(*this, funcImpl(_))
            .WillByDefault(Invoke(this, &MyTemplateMock<Context,InnerInterface>::funcImplCall));
    }
    void funcImplCall(Context* context)
    {
    }
};

我得到一个编译器错误,说:

error: need ‘typename’ before ‘testing::internal::Function<void(Context*)>::Result’ because ‘testing::internal::Function<void(Context*)>’ is a dependent scope
error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> class testing::Matcher’
error:   expected a type, got ‘testing::internal::Function<void(Context*)>::Argument1’

是否有可能专门化ON_CALL()宏中用于模板参数的gmock匹配器?还是我漏掉了。其他的吗? ?

我认为你需要模板版本的gmock的宏有_T追加:

MOCK_METHOD1_T(funcImpl, void (Context* context));

要了解更多信息,请参阅文档中的"Mocking Class Templates"章节。