GMOCK 接受变量参数的方法

问题描述 投票:0回答:2

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

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*, ...)>'

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

c++ googlemock
2个回答
6
投票

不幸的是,你不能直接在Gmock中模拟可变参数函数

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

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

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

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

但是,Nemelis on SO 建议了一些解决方法,您可以使用它们来实现此目的。它涉及处理您的

format
参数以及任何可变参数以创建单个
message
字符串,然后模拟一个将
message
作为单个参数的函数。


0
投票

我也遇到了同样的问题。我的解决方案是使用存根:

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;
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.