与其说是一个知识共享问题.
根据GoogleMock 常见问题解答,无法模拟可变参数函数,因为不知道将为函数提供多少参数.
这是事实,但在大多数情况下,人们知道从被测系统调用可变参数函数有多少变量,或者如何将可变参数转换为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 );
}
}
Run Code Online (Sandbox Code Playgroud)
希望这很有用.
小智 3
我不允许对之前的答案发表评论,但其中有两个错误:
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 );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |