2011-02-08 2 views
4

내 테스트 : 이것은 색소폰 이후의 것들에 밑줄을 긋는 부분입니다. 내가 try-catch 블록을 가지고 ....하지만 인터넷이 예외를 테스트 할 수있는 적절한 방법이 @Test(expected=IllegalArgumentException.class)Java : Junit4 : 예외 테스트가 작동하지 않고 try-catch 블록을 고집합니다.

@Test(expected= XMLClientNotFoind.class) 
public void testGetClientFromIP() throws XMLClientNotFound{ 
    ... 
    assertEquals(c, sax.getClientFromIP("101.0.2.01")); 
} 

그리고 방법이다 있다고 주장, getClientFromIP은 여기에 있습니다 :

public Client getClientFromIP(String ip) throws XMLClientNotFound { 
     ... 
     throw new XMLClientNotFound(); 
    } 

그리고 내 예외 : 모든

public class XMLClientNotFound extends Exception{ 

    } 

답변

7

첫째 :

@Test(expected=IllegalArgumentException.class) 

은 적절한 방법으로 간주해서는 안되며, 특히 일반적인 경우에는 예외로 간주해야합니다. 그 이유는 테스트 메소드에서 실제로 예외를 던진 구문을 제어 할 권한이 없다는 것입니다.

try { 
    shouldThrow() 
    fail("Expected exception"); 
} catch(XMLClientNotFound e) { 
    assertThat(e).hasMessage("Expected message"); //FEST-Assert syntax 
} 

당신은 수도 : 또한 정확하게 예외를 던질 생각하는 라인을 둘러싼 try-catch 사용 등 메시지 라벨, 원인,

에 어떤 주장을 할 수없는 것은 갈 수있는 올바른 방법이다 또한 JUnit @Rule을 시도해보십시오. 얼마 전 테스트를 더 쉽게 읽을 수 있도록 I wrote을 입력하십시오.

1

확인 된 예외에 대해서는 여전히 throws 절을 정의해야합니다. @Test(expected=...) 부분은 JUnit이 당신의 테스트 케이스가 그 예외를 던질 것으로 기대한다고 말한다.

0

다른 예외를 throw하는 테스트 메소드에 다른 코드가있을 수 있습니까? 예를 들어

... 당신이 ExceptionX을 처리하지 않기 때문에 컴파일러가 불평 것입니다 위의 경우

@Test(expected= XMLClientNotFoind.class) 
public void testGetClientFromIP() throws XMLClientNotFound{ 

    thisMethodThrows_ExceptionX(); 

    assertEquals(c, sax.getClientFromIP("101.0.2.01")); 
} 

. try/catch로 둘러 싸거나 테스트 메소드 서명에도 throws ExceptionX라고 말하면됩니다.

일반적으로 테스트 방법에서 한 가지를 테스트하는 것이 좋습니다. 예외를 throw하는 메서드를 기대하는 경우에는 어설 션을 이해할 수 없습니다. 아무것도 반환하지 않을 것이므로 주장 할 것이 없습니다.

관련 문제