TIL - 21.01.20
예외를 테스트하는 방법
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 none → Deprecated.
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 exceptionrunnable
- 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