тестирование нового оператора не выполнено

Я создал класс, в котором есть некоторые новый оператор в конструкторе. Я создал защиту в конструкторе для управления ошибкой нового оператора, но теперь я хочу его протестировать.

Например, у меня есть конструктор, который выглядит так:

Function::Function()
{
try
{
m_pxArgument = new Argument();
}
catch(std::bad_alloc)
{
throw MemoryException();
}
}

Можно ли создать тест, в котором я могу сообщить новому оператору об ошибке, чтобы проверить мой код перехвата?

1

Решение

Если Argument Ваш класс / структура — тогда определите оператор new в этом классе только для целей UT.

class Argument {
//...
#ifdef UNIT_TEST
static bool& failNew() { static bool failNew = false; return failNew; }
void* operator new(size_t size)
{
if (!failNew())
return ::operator new (size);
failNew() = false;
throw std::bad_alloc("Argument");
}
#endif
};

Просто установите Argument::failNew() = true; каждый раз вам нужно проваливать его выделение.

4

Другие решения

Чтобы сделать такой тест, вам нужно будет перегрузить operator new для тебя class Argument и затем предоставьте определение, которое выдает в вашем тестовом примере. Однако, поскольку это не может быть легко заменено во время выполнения, вам может понадобиться отдельная тестовая программа.

Если бы вы были моим учеником в C ++, я бы сначала спросил, почему вы в любом случае по-разному используете «пустой» элемент-указатель. Первый вариант — создать переменную-член типа Argument и пропустить явное выделение кучи. Если вам действительно нужно динамическое размещение в современном коде, я бы рекомендовал использовать shared_ptr<Argument> а также
Функция :: Function (): m_pxArgument (make_shared ()) {}

Второй вопрос, который я хотел бы задать, почему вы хотите перевести std::bad_alloc к вашему собственному типу исключения и, если это необходимо сделать в конструкторе. std::bad_alloc является стандартизированным исключением для ситуации, с которой вы на самом деле сталкиваетесь, и если это случается, живое обычно достаточно плохо, чтобы ваш маленький процесс не мог сделать много для восстановления (см. паттерн «Капитан Оутс» Чарльза Вейра и Джеймса Нобла).

1