【问题标题】:How to mock variadic functions using googlemock如何使用 googlemock 模拟可变参数函数
【发布时间】:2014-12-02 15:16:13
【问题描述】:

与其说是一个问题,不如说是一个知识共享。

根据 GoogleMock FAQ,不可能模拟可变参数函数,因为不知道该函数有多少参数。

这是真的,但在大多数情况下,人们知道从被测系统调用可变参数函数的变量有多少,或者如何将可变参数转换为 1 个非可变参数。
我的一位同事(不知道他是否在 Stackoverflow 上活跃)提出了一个可行的解决方案,如下例所示(使用模拟 C 类型接口):

class MockInterface
{
    public:
        MockInterface() {}
        ~MockInterface() {}
        MOCK_METHOD4( variadicfunction, void( const std:: string name, AN_ENUM mode,
             const std::string func_name, const std::string message ) );
};

boost::shard_ptr<MockInterface> mock_interface;

extern "C"
{
    void variadicfunction( const char *name, AN_ENUM mode,
        const char *func_name, const char *format, ... )
    {
        std::string non_variadic("");

        if (format != NULL )
        {
            va_list args;
            va_start( args, format );

            // Get length of format including arguments
            int nr = vsnprintf( NULL, 0, format, args );

            char buffer[nr];
            vsnprintf( buffer, nr+1, format, args );

            non_variadic = std::string( buffer );

            va_end( args );
        }
        
        mock_interface->variadicfunction( name, mode, func_name, non_variadic );
    }
}

希望这是有用的。

【问题讨论】:

  • 真是个聪明的把戏!但是,我认为你有一个缓冲区溢出(缓冲区应该用索引 nr + 1 i.m.o 声明)。感谢分享。

标签: googlemock


【解决方案1】:

我不能评论上一个答案,但它有两个错误:

  1. 缓冲区太小(上面@Bert 已经提到)
  2. 在虚拟vsnprintf() 之后(获取所需的buffer-size),args 指向最后一个变量参数的后面,所以它必须在真正的vsnprintf() 之前重置。

以下是更正的部分:

if (format != NULL )
{
    va_list args;

    va_start( args, format );
    // Get length of format including arguments
    int nr = vsnprintf( NULL, 0, format, args );
    va_end( args );

    char buffer[nr+1];
    va_start( args, format );
    vsnprintf( buffer, nr+1, format, args );
    va_end( args );

    non_variadic = std::string( buffer );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多