2010-03-22 8 views
39

거의 모든는 다음 서명으로 기록됩니다대부분의 JUnit 테스트에서 예외를 발생시키는 것이 좋습니다. 내 JUnit 테스트의

public void testSomething() throws Exception 

내 추론은 내가 차라리 JUnit을 무료로 내게 줄 것으로 보인다 예외 처리에 비해 테스트하고있는 무슨에 초점을 맞출 수 있다는 것입니다. 하지만이 일을하면서 나는 무엇인가 놓치고 있습니까? 모범 사례에 위배 되는가? 명시 적으로 예외를 잡아 내 테스트에서 아무 것도 얻지 못하고 실패 할 수 있습니까? 당신은 당신이 JUnit4에서 같은 것을 사용할 수 있습니다 던져 질 수있는 예외를 필요로 몇 가지 시나리오 (예 : ERR-R 처리)

테스트 할 때

+1

JUnit은 예외가 발생해도 테스트에 실패하지 않습니까? – brian

+0

@brian 명확히하기 위해 예, 잡히지 않는 예외가 발생하면 JUnit이 실패하지만 내 코드에 의해 던져진 예외를 잡아내는 맥락에서 의미합니다. –

답변

50

일반적으로 예외가 발생할 것으로 예상하지 않는 경우를 테스트하는 경우, 적절하게 구분할 수 있기 때문에 그림과 같이 예외를 throw하도록 허용합니다. 실패 사례 테스트 사례 귀하의 주장 중 하나를 전달하지 마십시오) 오류 테스트 케이스 (예상치 못한 예외가 발생 함). JUnit TestRunners는 Throw Exception을 catch 할 것이므로 Exception이 Throw되면 전체 테스트 스위트에 대해 걱정할 필요가 없습니다. 한편

, 당신은 예외를 트리거하도록되어 테스트, 다음 중 하나 JUnit 4에서는 주석의 @Test(expected=IllegalArgumentException.class) 변형, 또는 일반적인 JUnit을 3 관용구 사용하려면 작성하는 경우 :

try { 
    target.someMethodToTest(); 
    fail("Should have gotten an exception"); 
} catch (IllegalStateException ise) { 
    //expected, it's all good 
} 
+4

이것은 가장 좋은 답변입니다. 나는 여기서 질문이 스타일의 하나라고 생각한다고 덧붙일 것이다 : catch-and-fail, 또는 throw? 일반적으로 모범 사례는 "예외를 throw"하지 않습니다. API 사용자에게는 예외 처리가 의미가 없기 때문입니다. 하지만 여기에는 그런 사용자가 없습니다. 그래서 "예외를 던집니다"는 올바른 습관입니다. –

3

주요 이점은 포함한다 : @Test를 (= ArithmeticException.class 예상)하지만, 어떤 사람들은 명시 적 try {} catch (Exception e) 블록보다 읽기 어렵다는 것을 알기 때문에 상태를 확인하거나 (일부 mock 객체에 대해) 예외를 던지기를 원한다면 올바른 장소 또는 기록 된 것 등)

3

예외가 발생했으나 예상하지 못하는 경우 테스트가 실패해야합니다.

체크되지 않은 예외 인 경우 예외가 throw되고 JUnit이 테스트에 실패하도록 허용합니다.

확인 된 예외 인 경우 메소드 서명의 throws 절에 예외를 추가하거나 메소드 내부에서 예외를 catch 할 수 있습니다. 컴파일러는 선택 사항없이 코드를 실행할 수 없으므로 선택을하게됩니다.

최근에는 테스트에서 예외를 발견하지 못했습니다. 예외가 발생하면 해당 주석을 주석으로 표시합니다. 확인되지 않은 예외가 발생하면 JUnit이 테스트를 통과하지 못했습니다. 확인 된 예외 인 경우 throws 절을 메서드 시그니처에 추가하고 왼쪽 JUnit이 테스트를 실패합니다.

+0

테스트가 실패해야한다는 데 동의하지만 제 질문은 예외를 catch하고 명시 적으로 테스트를 실패해야하는지 아니면 JUnit 프레임 워크에 맞춰 테스트를 실패하게 할 것인가에 대한 것입니다. –

+0

전달하는 경우 "이 예외가 나타납니다."라는 의미로 사용되어야하는 @expected 주석이 있습니다. – duffymo

10

중요한 정보를 놓치지 마세요. 모든 예외 사항이 즉시 처리되도록하십시오. 즉, 던져 질 수있는 서명을 확인 된 각 예외에 추가해야합니다. 그러나, 나는 게으른 방법을 취하지 말고 맹목적으로 throws Exception을 버릇의 문제로 사용하는 것이 좋습니다. 이 변명은 심지어 에 대해서도은 API가 예외와 관련하여 실제로 어떻게 작동하는지 생각하지 않습니다.

+5

IMHO, 검사 된 예외의 전체 목록을 테스트 방법에 추가하는 것은 많은 이점을 제공하지 못하고 실제로 테스트 서명의 가독성을 저해합니다 (특히 SUT가 많은 예외를 throw 할 수있는 경우). – Jacob

관련 문제