예외를 기대하는 세 가지 방법
간단한 경우를 알아보자. 통장에 잔고보다 많은 돈을 인출하려고 하면 Account 코드는 예외를 던져야 한다.
단순한 방식 : 어노테이션 사용
JUnit의 @Test 어노테이션은 기대한 예외를 지정할 수 있는 인자를 제공한다.
@Test(expected=InsufficientFundsException.class)
public void thorwsWehnWithdrawingTooMuch(){
account.withdraw(100);
}
해당 메서드를 실행할 때 InsufficientFundsException
예외가 발생하면 테스트는 통과한다.
옛날 방식 : try/catch와 fail
try/catch 블록을 사용할 수도 있다. 예외가 발생하지 않으면 fail()
메서드를 호출해 강제로 실패한다
try{
account.withdraw(100);
fail();
}
catch(InsufficientFundsException e){
assertThat(e.getMessage(), equalTo("balance is not enough"));
}
위와 같은 방식은 예외가 발생한 후 어떤 상태를 검사할 때 유용하다. 위 코드에서는 메시지를 확인했다.
새로운 방식 : ExpectedExeption
ExpectedExeption
규칙은 예외를 검사하는데 있어 위의 두 가지 방식의 좋은 점만 모았다.
ExpectedExeption
을 사용하려면 테스트 클래스에 Expected Exeption
인스턴스를 public
으로 선언하고 @Rule
어노테이션을 달아준다. 아래는 예시다
import org.junit.rules.*;
...
@Rule
public ExpectedExeption thrown = ExpectedExeption.none();
@Test
public void exceptionRule(){
thrown.expect(InsufficientFundsException.class);
thrown.expectMessage("balance is not enough"); // 올바른 영어 표현인지는 모르겠음 ㅋ
account.withdraw(100);
}
- 테스트 셋업 단계에서 나머지 테스트를 실행할 때 발생할 수 있는 일을 알린다.
- thrown 규칙 인스턴스는
InsufficientFundsException
이 발생함을 알려준다 - 예외 객체에 적절한 메시지가 포함되어 있는지 검사하길 원하여 thrown 규칙에 따른 기대 사항을 지정한
- 예외가 발생하길 바라는 테스트 실행 부분(withdraw 메서드를 호출해 자금을 인출하는 부분)을 실행한다
예외무시
자바는 검증된 예외(checked Exception)를 처리하도록 우리를 괴롭힌다 0.0
예외를 무시하려면 try/catch 블록을 넣지 말고 대신 발생하는 예외를 다시 던진다
@Test
public void readsFromTestFile() throws IOException{
String filename = "test.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
writer.write("test test test");
writer.close();
//...
}