Я создал класс, в котором есть некоторые новый оператор в конструкторе. Я создал защиту в конструкторе для управления ошибкой нового оператора, но теперь я хочу его протестировать.
Например, у меня есть конструктор, который выглядит так:
Function::Function()
{
try
{
m_pxArgument = new Argument();
}
catch(std::bad_alloc)
{
throw MemoryException();
}
}
Можно ли создать тест, в котором я могу сообщить новому оператору об ошибке, чтобы проверить мой код перехвата?
Если 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;
каждый раз вам нужно проваливать его выделение.
Чтобы сделать такой тест, вам нужно будет перегрузить operator new
для тебя class Argument
и затем предоставьте определение, которое выдает в вашем тестовом примере. Однако, поскольку это не может быть легко заменено во время выполнения, вам может понадобиться отдельная тестовая программа.
Если бы вы были моим учеником в C ++, я бы сначала спросил, почему вы в любом случае по-разному используете «пустой» элемент-указатель. Первый вариант — создать переменную-член типа Argument и пропустить явное выделение кучи. Если вам действительно нужно динамическое размещение в современном коде, я бы рекомендовал использовать shared_ptr<Argument>
а также
Функция :: Function (): m_pxArgument (make_shared ()) {}
Второй вопрос, который я хотел бы задать, почему вы хотите перевести std::bad_alloc
к вашему собственному типу исключения и, если это необходимо сделать в конструкторе. std::bad_alloc
является стандартизированным исключением для ситуации, с которой вы на самом деле сталкиваетесь, и если это случается, живое обычно достаточно плохо, чтобы ваш маленький процесс не мог сделать много для восстановления (см. паттерн «Капитан Оутс» Чарльза Вейра и Джеймса Нобла).