gmock一种接受变量参数的方法

GMOCK a method accepting variable arguments

本文关键字:变量 参数 方法 一种 gmock      更新时间:2023-10-16

我有一个具有接受变量参数的方法:

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中的变异功能:

您无法直接模拟variadic函数(即,在Google Mock中直接获取Ellipsis(...)参数)。

问题是,通常,模拟对象无法知道将多少参数传递给variadic方法,以及参数的类型是什么。只有基类的作者才知道该协议,我们不能看他的头。

因此,要模拟此类功能,用户必须教模拟对象如何找出参数及其类型的数量。一种方法是提供函数的超载版本。

省略者参数是从C继承的,而不是真正的C 功能。它们不安全使用,不使用具有构造函数或破坏者的论点。因此,我们建议尽可能避免在C 中避免它们。

但是,尼梅利斯(Nemelis)提出了一些解决方法,您可以用来实现这一目标。它涉及处理您的 format参数以及任何variadic参数以创建一个message字符串,然后模拟一个将message作为单个参数中的函数。