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

2021. 8. 13. 13:04JAVA/JUNIT

글의 목적

  1. JUnit에서 적어도 세 가지 방식으로 기대한 예외를 던지는 것을 명시하는 방법을 실습합니다.

3.2.1 단순한 방식 : 애너테이션 사용

아래와 같이 @Test 애너테이션의 인자를 설정하여 해당 테스트에서 예외가 발생되기를 기대할 수 있습니다.

만약 기대한 예외가 발생하면 테스트는 통과하고, 그렇지 않으면 테스트는 실패합니다.

   @Test(expected=InsufficientFundsException.class)
   public void throwsWhenWithdrawingTooMuch() {
      account.withdraw(100);
   }

3.2.2 옛 방식: try/catch와 fail

발생한 예외를 처리하는 방법으로 try/catch 블록을 활용할 수도 있습니다. 예외가 발생하지 않으면 org.junit.Assert.fail() 메서드를 호출하여 강제로 실패합니다.

   @Test
   public void throwsWhenWithdrawingTooMuchTry() {
      try {
         account.withdraw(100);
         fail();
      }
      catch (InsufficientFundsException expected) {
         assertThat(expected.getMessage(), equalTo("balance only 0"));
      }
   }

옛 방식은 예외가 발생한 후에 어떤 상태를 검사할때 유용합니다. 위의 코드와 같이 예외가 발생한 후 메시지를 확인하려고 합니다.

 

3.2.3 새로운 방식: ExpectedException 규칙

JUnit은 커스텀 규칙을 정의하여 테스트가 실행되는 흐름 동안 발생하는 일에 대한 더 큰 통제권을 부여합니다. JUnit은 바로 사용할 수 있는 소수의 유용한 규칙들을 제공합니다. 특히 ExpectedException 규칙은 예외를 검사하는데 있어 단순한 방식과 옛 방식의 좋은 점만 모았습니다.

 

ExpectedException 규칙 사용 방법

  1. 테스트 클래스에 ExpectedException 인스턴스를 public으로 선언
  2. @Rule 애너테이션 설정
   @Rule
   public ExpectedException thrown = ExpectedException.none();  
   
   @Test
   public void exceptionRule() {
      thrown.expect(InsufficientFundsException.class); 
      thrown.expectMessage("balance only 0");  
      
      account.withdraw(100);  
   }

테스트의 준비 단계에서 나머지 테스트를 실행할 때 발생할 수 있는 일을 규칙에 알립니다.

 

3.2.4 예외 무시

검증된 예외를 처리하기 위해 테스트 코드에 try/catch 블록을 넣지 마세요. 그 대신 발생하는 예외를 다시 던지세요.

   @Test
   public void readsFromTestFile() throws IOException {
      String filename = "test.txt";
      BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
      writer.write("test data");
      writer.close();
      // ...
   }

 

References

자바와 JUnit을 활용한 실용주의 단위 테스트
github : https://github.com/yonghwankim-dev/JUNIT-study/tree/main/iloveyouboss_13/test

'JAVA > JUNIT' 카테고리의 다른 글

AssertJ 테스트시 객체의 동등성(Equality) 검증 방법  (0) 2024.04.07
3.1 JUnit 단언  (0) 2021.08.13
2.1 JUNIT 테스트 고려사항 구현  (0) 2021.08.11
2. JUNIT 사용  (1) 2021.08.11
1. 첫번째 JUnit 테스트 만들기  (0) 2021.08.10