[JUnit] 테스트시 예외를 기대하는 방법

예외를 기대하는 세 가지 방법

간단한 경우를 알아보자. 통장에 잔고보다 많은 돈을 인출하려고 하면 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();
    //...
}