16.2 단위 테스트 작성법 (JUnit5 + AssertJ)
1. JUnit5 핵심 애너테이션
@DisplayName("UserService 단위 테스트") // 테스트 클래스/메서드에 한글 이름 부여
class UserServiceTest {
@Test
@DisplayName("이메일이 중복되면 예외가 발생한다.")
void 이메일_중복_예외_발생() {
// Given (테스트 준비)
UserService userService = new UserService(new FakeUserRepository());
// When (동작 수행)
Executable tryRegister = () -> userService.register("duplicate@test.com", "password");
// Then (결과 검증)
assertThatThrownBy(tryRegister::execute)
.isInstanceOf(DuplicateEmailException.class)
.hasMessageContaining("이미 사용 중인 이메일");
}
@ParameterizedTest
@ValueSource(strings = {"invalid", "no-at-sign", ""})
@DisplayName("유효하지 않은 이메일 형식이면 예외가 발생한다.")
void 이메일_형식_검증(String invalidEmail) {
assertThatThrownBy(() -> new Email(invalidEmail))
.isInstanceOf(IllegalArgumentException.class);
}
@Nested
@DisplayName("포인트 차감 테스트")
class PointDeductTest {
@Test
@DisplayName("포인트가 충분하면 차감에 성공한다.")
void 포인트_차감_성공() { ... }
@Test
@DisplayName("포인트가 부족하면 예외가 발생한다.")
void 포인트_부족_예외() { ... }
}
}
2. AssertJ를 이용한 가독성 높은 검증
JUnit5 기본 Assertions보다 훨씬 유창하고 가독성 높은 검증을 제공합니다.
// 값 검증
assertThat(result).isEqualTo(expected);
assertThat(list).hasSize(3).contains("A", "B");
assertThat(user.getName()).isNotNull().startsWith("John");
assertThat(price).isGreaterThan(0).isLessThanOrEqualTo(100_000);
// 예외 검증
assertThatThrownBy(() -> service.dangerousMethod())
.isInstanceOf(CustomException.class)
.hasMessage("에러 메시지");
// Optional 검증
assertThat(optUser).isPresent().hasValueSatisfying(u ->
assertThat(u.getEmail()).isEqualTo("user@example.com")
);