googlemock - 如何使用 googlemock 模拟可变参数函数

标签 googlemock

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

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 );
    }
}
希望这是有用的。

最佳答案

我不允许对上一个答案发表评论,但其中有两个错误:

  • 缓冲区太小(上面@Bert 已经提到)
  • 假人后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 );
    }
    

    关于googlemock - 如何使用 googlemock 模拟可变参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252757/

    相关文章:

    c++ - Google Mock : passing pointer to mock object, 但方法调用仍在调用真实方法

    c++ - 避免使用 Google Mock 调用基类

    c++ - 谷歌模拟单例 C++ 类

    c++ - gmock TypedEq 相同的字符串不同的地址

    c++ - 哪些模拟框架允许对遗留代码进行零更改?

    c++ - 对 Google Mock 返回的引用所做的更改能否反射(reflect)在原始值中?

    c++ - GMock : Overriding a default expectation

    c++ - 验证参数对于 gmock 中的多个预期调用具有相同的值

    c++ - 在单元测试时如何模拟基类的非重写、虚拟/非虚拟方法?

    c++ - Gmock 无法模拟在同一类中调用另一个方法的方法