【问题标题】:googlemock - mock a method that returns a complex datatypgooglemock - 模拟返回复杂数据类型的方法
【发布时间】:2012-04-18 10:25:58
【问题描述】:

我想模拟一个返回复杂数据类型的方法

class aClass
{
public:
   virtual const QMap<QString, QString> aMethod() const;
}

class MockaClass : public aClass
{
public:
   MOCK_CONST_METHOD0(aMethod, const QMap<QString, QString>());
}

此代码无法编译:“宏“MOCK_CONST_METHOD0”传递了 3 个参数,但只接受了 2 个”

我认为 googlemock 宏不理解 QMap 并将逗号解释为参数分隔符。

有没有办法告诉 googlemock QMap 是返回值?

【问题讨论】:

    标签: c++ googletest googlemock


    【解决方案1】:

    只需像这样使用typedef:

    class aClass
    {
    public:
       typedef const QMap<QString, QString> MyType;
       virtual MyType aMethod() const;
    }
    
    class MockaClass : public aClass
    {
    public:
       MOCK_CONST_METHOD0(aMethod, MyType());
    }
    

    【讨论】:

    • Errrrm,不应该是MOCK_CONST_METHOD1,因为它需要一个参数吗? (不过很好的解决方案)
    • @Mawg: aMethod 的参数为零,因此MOCK_CONST_METHOD0应该是正确的。
    • 啊啊!!我看错了……好尴尬。感谢您指出这一点
    【解决方案2】:

    你是对的,逗号被解释为参数分隔符。您可以定义一个预处理器宏来保护逗号不被这种方式解释。

    #define COMMA ,
    MOCK_CONSTANT_METHOD0(aMethod, const QMap<QString COMMA QString>());
    

    请注意,这不一定适用于嵌套宏调用。例如,如果MOCK_CONSTANT_METHOD0 将第二个参数传递给另一个宏,您将再次遇到麻烦。

    【讨论】:

    • 为什么引入这个define可以避免编译错误?生成的代码(预处理后)与问题中的相同。你能解释一下,为什么会这样吗?
    • @RonaldMcBean 我不知道为什么会这样,但似乎预处理器先提取参数,然后扩展其中的宏。
    【解决方案3】:

    只需将() 用于复杂参数,

    class MockaClass : public aClass
    {
    public:
       MOCK_METHOD((const QMap<QString, QString>), aMethod, (), (const));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多