2017-09-28 176 views
1

的方法我已经有一个方法,一个类可以接受变量参数: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

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

你不能嘲笑一个可变参数函数(即函数以省略号(...)参数)直接在谷歌模拟。

问题是,一般来说,模拟对象无法知道有多少参数传递给可变参数方法,以及参数的类型是什么。只有基础类的作者知道协议,我们不能看他的头。

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

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

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

+0

感谢您的指点 - 它解决了我的问题 – Prakash

相关问题