GMOCK接受变量参数的方法

时间:2017-09-28 13:23:26

标签: c++ gmock

我有一个类,它有一个接受变量参数的方法:

class MyClass
{
public:
virtual void myprint(const char* format, ...) = 0; 
};

我试图模仿上面的课程

class Mock : public MyClass
{
public:
MOCK_METHOD1(myprint, void (const char* format, ...));
}

但它给出了我的编译问题:

error: 'Result' in 'struct testing::internal::Function<void(const char*, ...)>' does not name a type
  MOCK_METHOD1(myprint, void (const char* format, ...));
  ^
error: incomplete type 'testing::internal::Function<void(const char*, ...)>' used in nested name specifier
 error: incomplete type 'testing::internal::Function<void(const char*, ...)>' used in nested name specifier
error: template argument 1 is invalid
error: field 'gmock1_print_15' has incomplete type 'testing::internal::FunctionMocker<void(const char*, ...)>'

如何模拟将变量参数作为参数的方法?

1 个答案:

答案 0 :(得分:3)

不幸的是,你cannot directly mock a variadic function in Gmock

  

您无法直接在Google Mock中模拟可变参数函数(即使用省略号(...)参数的函数)。

     

问题在于,一般情况下,模拟对象无法知道有多少参数传递给可变方法,以及参数的类型是什么。只有基类的作者知道协议,我们无法深入了解他的想法。

     

因此,要模拟这样的函数,用户必须教模拟对象如何计算参数的数量及其类型。一种方法是提供函数的重载版本。

     

省略号参数是从C继承而不是C ++特性。它们使用起来不安全,不适用于具有构造函数或析构函数的参数。因此,我们建议尽可能在C ++中避免使用它们。

但是,SO上的Nemelis建议您some workaround可以用来实现此目的。它涉及处理您的format参数以及任何可变参数以创建单个message字符串,然后模拟以message作为单个参数的函数。