首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用googlemock模拟各种函数

如何使用googlemock模拟各种函数
EN

Stack Overflow用户
提问于 2014-12-02 15:16:13
回答 1查看 4.2K关注 0票数 11

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

根据GoogleMock 常见问题,不可能模拟变量函数,因为不知道函数将被赋予多少参数。

这是正确的,但在大多数情况下,人们知道变量函数从被测试的系统调用了多少变量,或者如何将变量参数转换为1个非变量参数。

我的一位同事(不知道他是否在Stackoverflow上活动)提出了一个工作解决方案,如下面的示例所示(对C类型接口使用模拟):

代码语言:javascript
复制
    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 );
        }
    }

希望这是有用的。

EN

回答 1

Stack Overflow用户

发布于 2020-07-16 13:17:58

我不允许对先前的答案发表评论,但其中有两个but:

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

以下是修正后的部分:

代码语言:javascript
复制
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 );
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27252757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档