[REST API 보안 적용]_02_예외 테스트

1 minute read

예외 테스트

  1. @Test(expected)

    예외 타입만 확인 가능

  2. try-catch

    예외 타입과 메시지 확인 가능.

    하지만 코드가 다소 복잡.

  3. @Rule ExpectedException

    코드는 간결하면서 예외 타입과 메시지 모두 확인 가능


예외를 테스트하는 방법 4가지

1. @Test(expected)

@Test(expected)로 특정 예외가 발생하는지 예외타입 확인 가능

존재하지 않는 Account인 경우 UsernameNotFoundException 에러가 발생하는지 확인

@Test(expected = UsernameNotFoundException.class)
@Description("존재하지않는 username인 경우 UsernameNotFoundException 예외가 발생")
public void findByUsernameFail() {
  String username = "random@email.com";
  accountService.loadUserByUsername(username);
}

2. try-catch

에러 객체를 받아오기 때문에 훨씬 더 많은 내용을 확인 & 테스트할 수 있다.

import static org.assertj.core.api.Fail.fail;

@Test
@Description("존재하지않는 username인 경우 UsernameNotFoundException 예외가 발생")
public void findByUsernameFail() {
    String username = "random@email.com";
    try {
        accountService.loadUserByUsername(username);
        fail("supposed to be failed"); //예외가 발생하지 않고 여기로 온다면 테스트 실패임을 명시적으로 알려줌
    } catch (UsernameNotFoundException e) {
        assertThat(e.getMessage()).containsSequence(username);
    }
}

3. @Rule ExpectedException

코드는 간결하면서 예외 타입과 메시지 모두 확인 가능

  • public으로 ExpectedException을 @Rule로 등록
@Rule
public ExpectedException expectedException = ExpectedException.none();
  • 예상되는 예외를 먼저 적어줘야한다. ★
@Test
@Description("존재하지않는 username인 경우 UsernameNotFoundException 예외가 발생")
public void findByUsernameFail() {
  // Expected
  String username = "random@email.com";
  expectedException.expect(UsernameNotFoundException.class);
  expectedException.expectMessage(Matchers.containsString(username));

  // When
  accountService.loadUserByUsername(username);
}

※ static ExpectedException noneDeprecated.

​ Since 4.13 Assert.assertThrows can be used to verify that your code throws a specific exception.

4. Assert.assertThrows

public static <T extends Throwable> T assertThrows(Class<T> expectedThrowable,
                                                   ThrowingRunnable runnable)

실행 가능한 어설 션은 실행될 때 expectedThrowable 유형의 예외를 발생시킵니다. 그렇다면 예외 개체가 반환됩니다. 예외가 발생하지 않으면 AssertionError가 발생합니다.

잘못된 유형의 예외가 발생하면 불일치를 설명하는 AssertionError가 발생합니다. 실제로 발생한 예외는 Throwable.getCause().를 호출하여 얻을 수 있습니다.

  • Parameters:

    expectedThrowable - the expected type of the exception

    runnable - a function that is expected to throw an exception when executed

  • Returns:

    the exception thrown by runnable

  • Since:

    4.13

@Test
@Description("존재하지않는 username인 경우 UsernameNotFoundException 예외가 발생")
public void findByUsernameFail() {
  // Given
  String username = "random@email.com";

  // When
  assertThrows(UsernameNotFoundException.class, () -> accountService.loadUserByUsername(username));
}