我有一个类,它有一个接受变量参数的方法:
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*, ...)>'
如何模拟将变量参数作为参数的方法?
答案 0 :(得分:3)
不幸的是,你cannot directly mock a variadic function in Gmock:
您无法直接在Google Mock中模拟可变参数函数(即使用省略号(...)参数的函数)。
问题在于,一般情况下,模拟对象无法知道有多少参数传递给可变方法,以及参数的类型是什么。只有基类的作者知道协议,我们无法深入了解他的想法。
因此,要模拟这样的函数,用户必须教模拟对象如何计算参数的数量及其类型。一种方法是提供函数的重载版本。
省略号参数是从C继承而不是C ++特性。它们使用起来不安全,不适用于具有构造函数或析构函数的参数。因此,我们建议尽可能在C ++中避免使用它们。
但是,SO上的Nemelis建议您some workaround可以用来实现此目的。它涉及处理您的format
参数以及任何可变参数以创建单个message
字符串,然后模拟以message
作为单个参数的函数。