Как смоделировать различные функции с помощью googlemock
Не столько вопрос, сколько обмен знаниями.
В соответствии с часто задаваемыми вопросами GoogleMock невозможно смоделировать функции с переменными числами, поскольку неизвестно, сколько аргументов будет передано функции.
Это правда, но в большинстве случаев известно, с каким количеством переменных вызывается переменная функция из тестируемой системы или как преобразовать переменные аргумента в 1 невариантный аргумент.
Мой коллега (не знаю, активен ли он в Stackru) предложил рабочее решение, как показано в примере ниже (с использованием макета для интерфейса типа 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 );
}
}
Надеюсь, это полезно.
0 ответов
Мне не разрешено комментировать предыдущий ответ, но в нем есть две ошибки:
- буфер слишком мал (уже упоминалось @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 );
}