2012-09-16 5 views
1

생성자에 새로운 연산자가있는 클래스를 만들었습니다. 새로운 연산자 실패를 관리하기 위해 생성자에 경비원을 만들었지 만 지금은 테스트하고 싶습니다.새 연산자 테스트에 실패했습니다.

예를 들어, 나는이처럼 생성자를했습니다 :

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

그것이 내가 내 catch 코드를 테스트하는 데 실패 new 연산자를 말할 수있는 테스트를 만들 수 있습니까?

+0

저는 전문 프로그래머가 아니지만, 생성자 밖에서'try'를 사용하는 것이 더 좋습니다. –

+0

'Argument'는 클래스/구조체입니까? – PiotrNycz

+0

단지 예일 뿐이므로 실제 클래스가 더 복잡하고 라이브러리 특정 예외를 처리하기 때문에 try 문은 내부에 있어야합니다. 이 경우 std :: bad_alloc은 유효한 예외이지만 내부 관리에 의해 throw됩니다. 내 의견으로는 좋지 않습니다. 사용자는 클래스 내부에 대해서는 알지 못하고, 내부 예외에 대해서도 알지 못한다. – Jepessen

답변

4

Argument이 클래스/구조체 인 경우 UT 용으로이 클래스에서 new 연산자를 정의하십시오.

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;으로 설정하면됩니다.

+0

감사합니다. 좋은 제안입니다. 나는 그것을 시도 할 것이고, 그것이 나를 위해 효과가 있는지 알려줄 것이다. – Jepessen

1

그런 테스트를 수행하려면 class Argument에 대해 operator new을 오버로드 한 다음 테스트 케이스에 던져 넣는 정의를 제공해야합니다. 그러나 런타임시 쉽게 교환 할 수 없으므로 별도의 테스트 프로그램이 필요할 수 있습니다.

내 C++ 학생이라면, 왜 신제품을 사용하는지 물어볼 것입니다. 그리고 어쨌든 "벌거 벗은"포인터 멤버 일 수도 있습니다. 첫 번째 선택은 Argument 유형의 멤버 변수를 만들고 명시 적 힙 할당을 건너 뛸 것입니다. 당신이 정말로 현대적인 코드에서 동적 할당이 필요하면 내가 shared_ptr<Argument> 및 기능 : 기능()를 사용하는 것이 좋습니다 것 : m_pxArgument을 (make_shared()) {}

내가 묻고 싶다 두 번째 질문, 당신이 원하는 이유 std::bad_alloc을 자신의 예외 유형으로 변환하고이를 생성자에서 수행해야하는지 확인하십시오. std::bad_alloc은 실제로 발생하는 상황에 대해 표준화 된 예외이며 일반적으로 라이브는 일반적으로 작은 프로세스로 복구 할 수 없을 정도로 충분히 나쁩니다 (Charles Weir 및 James Noble의 패턴 "Captain Oates"참조).

+0

안녕하세요. 처음에 말했듯이, 이것은 단지 하나의 예일뿐입니다. 내 실제 수업은 좀 더 복잡하고 새로운 운영자가 필요합니다. 하지만이 제안에 대해 share_ptr을 확인해 보겠습니다. 귀하의 두 번째 회신을 위해, 내가 라이브러리에 대한 균일 한 예외 관리를 제공하기 때문에 싶습니다, 그리고이 경우 제네릭 메모리 예외는 내 의견으로 선호됩니다. 내부 구현에 대한 세부 사항을 제공하지 않기 때문에 변경 될 수 있습니다. 시간이 지남에. – Jepessen

관련 문제