2015-10-04 3 views
1

Мне нужно вызвать bad_alloc для моего модульного теста (в основном, для покрытия 100% кода, я не могу изменить некоторые функции). Что мне делать?
Вот мой пример кода. Я должен вызвать bad_alloc где-то здесь.Как вызвать bad_alloc

bool insert(const Value& v) { 
    Value * new_value; 
    try { 
     new_value = new Value; 
    } 
    catch (std::bad_alloc& ba){ 
     std::cerr << "bad_alloc caught: " << ba.what() << std::endl; 
     return false; 
    } 
    //... 
    //working with new_value 
    //... 
    return true; 
}; 
+0

Попробуйте выделить смехотворно большой массив вашей ценности. –

+0

@AnonMail проблема в том, что мне нужно только одно значение, если нет bad_alloc. –

+1

Вы пытаетесь выполнить стресс-тест как единичный тест. Этот подход обычно не рекомендуется, и, кроме того, его трудно достичь без добавления какого-либо кода, по крайней мере, используя директивы компилятора, такие как #ifdef TEST_3 и т. Д. –

ответ

1

Вы можете просто явно throwstd::bad_alloc в тестовом модуле. Например

#include <iostream> 
#include <new> 

void test_throw() 
{ 
    throw std::bad_alloc(); 
} 

int main() 
{ 
    try 
    { 
     test_throw(); 
    } 
    catch (std::bad_alloc& ba) 
    { 
     std::cout << "caught"; 
    } 
} 
+0

Я не могу изменить какие-либо функции, и я могу передать только параметр Value в этой функции. –

+0

Единственный способ вызвать 'std :: bad_alloc' иначе, чем' throw', это будет вызывать 'insert' в цикле' while' снова и снова, пока не закончится память. Я бы не рекомендовал это, потому что вы пропустите все эти указатели и, возможно, повредите другие вещи, используя всю эту память. – CoryKramer

1

Вы можете использовать возможность overloading class-specific operator new:

#include <stdexcept> 
#include <iostream> 

#define TESTING 

#ifdef TESTING 
struct ThrowingBadAlloc 
{ 
    static void* operator new(std::size_t sz) 
    { 
     throw std::bad_alloc(); 
    } 
}; 
#endif 

struct Value 
#ifdef TESTING 
: ThrowingBadAlloc 
#endif 
{ 
}; 

bool insert(const Value& v) { 
    Value * new_value; 
    try { 
     new_value = new Value; 
    } 
    catch (std::bad_alloc& ba){ 
     std::cerr << "bad_alloc caught: " << ba.what() << std::endl; 
     return false; 
    } 
    //... 
    //working with new_value 
    //... 
    return true; 
}; 

int main() 
{ 
    insert(Value()); 
} 
Смежные вопросы