TIL - 21.01.20

1 minute read

예외를 테스트하는 방법

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));
}

5. assertThatThrownBy()

예외가 발생하는 코드를 넣고, 해당 예외가 맞는지 확인

@Test
@DisplayName("없는 회원정보 조회")
void view_user_profile_fa() {
    // Given
    User user = new User.Builder()
            .seq(0)
            .email("solar@test.com")
            .passwd("password10")
            .build();
    int notExistUserId = 1000;

    // WHEN
    when(userRepository.findById(notExistUserId)).thenReturn(Optional.empty());

    // Then
    assertThatThrownBy(() -> {
        userService.viewProfile(notExistUserId);
    }).isInstanceOf(NotFoundUserException.class)
            .hasMessage("회원 정보를 찾을 수 없습니다.");
}

자주 쓰이는 예외 처리 syntax AssertJ에서는 자주 발생하는 예외들에 대해서 정의된 함수를 제공한다.

assertThatNullPointerException assertThatIllegalArgumentException assertThatIllegalStateException
assertThatIOException

REF

https://pjh3749.tistory.com/241