我有一个类,它有一个接受变量参数的方法:
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*, ...)>'
如何模拟以变量参数作为参数的方法?
不幸的是,你不能直接在Gmock中模拟可变参数函数:
您不能直接在 Google Mock 中模拟可变参数函数(即采用省略号 (...) 参数的函数)。
问题在于,一般来说,模拟对象无法知道有多少参数传递给可变参数方法,以及参数的类型是什么。只有基类的作者知道协议,我们无法深入他的头脑。
因此,要模拟这样的函数,用户必须教导模拟对象如何计算参数的数量及其类型。一种方法是提供该函数的重载版本。
省略号参数继承自 C,并不是真正的 C++ 功能。它们使用起来不安全,并且不适用于具有构造函数或析构函数的参数。因此我们建议在 C++ 中尽可能避免使用它们。
但是,Nemelis on SO 建议了一些解决方法,您可以使用它们来实现此目的。它涉及处理您的
format
参数以及任何可变参数以创建单个 message
字符串,然后模拟一个将 message
作为单个参数的函数。
我也遇到了同样的问题。我的解决方案是使用存根:
class StubClass : public MyClass {
public:
uint32_t m_print_counter;
StubClass()
: m_print_counter {}
{
}
void printf(const char*, ...) override
{
m_print_counter += 1;
}
void reset()
{
m_print_counter = 0;
}
};