JAVA · 테스트
JUnit 5 & Mockito
JUnit 5의 현대적 테스트 기능과 Mockito로 외부 의존성을 격리합니다.
테스트중급JUnit5MockitoAssertJ@Mock@InjectMocks
핵심 설명
JUnit 5의 현대적 테스트 기능과 Mockito로 외부 의존성을 격리합니다.
Java code
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;
import org.mockito.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
// 테스트 대상
class UserService {
private final UserRepository repo;
UserService(UserRepository repo) { this.repo = repo; }
User findUser(int id) {
return repo.findById(id)
.orElseThrow(() -> new NotFoundException("User", id));
}
}
// JUnit 5 테스트 클래스
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock UserRepository mockRepo;
@InjectMocks UserService userService;
@BeforeEach
void setUp() {
System.out.println("각 테스트 전 실행");
}
@Test
@DisplayName("존재하는 사용자 조회 성공")
void findUser_whenExists_returnsUser() {
var expected = new User(1, "Alice");
when(mockRepo.findById(1)).thenReturn(Optional.of(expected));
var result = userService.findUser(1);
assertThat(result.name()).isEqualTo("Alice");
verify(mockRepo, times(1)).findById(1);
}
@Test
@DisplayName("없는 사용자 → NotFoundException")
void findUser_whenNotExists_throws() {
when(mockRepo.findById(99)).thenReturn(Optional.empty());
assertThatThrownBy(() -> userService.findUser(99))
.isInstanceOf(NotFoundException.class)
.hasMessageContaining("User");
}
// 파라미터화 테스트
@ParameterizedTest(name = "{0} → {1}")
@CsvSource({
"90, A",
"80, B",
"70, C",
"60, D",
"50, F",
})
void gradeTest(int score, String expected) {
assertThat(Calculator.grade(score)).isEqualTo(expected);
}
@Nested
@DisplayName("경계값 테스트")
class BoundaryTests {
@Test void minScore() { assertThat(Calculator.grade(0)).isEqualTo("F"); }
@Test void maxScore() { assertThat(Calculator.grade(100)).isEqualTo("A"); }
}
}학습 팁
AssertJ의 assertThat()은 JUnit의 assertEquals()보다 훨씬 읽기 쉬운 실패 메시지를 제공합니다. 현대 Java 프로젝트에서 표준입니다.
주의할 점
@ExtendWith(MockitoExtension.class) 없이 @Mock을 사용하면 Mock이 null로 남습니다. JUnit 5에서는 반드시 Extension을 추가하세요.
자주 묻는 질문
JUnit 5 & Mockito란 무엇인가요?
JUnit 5의 현대적 테스트 기능과 Mockito로 외부 의존성을 격리합니다.
JUnit 5 & Mockito 학습 시 주의할 점은 무엇인가요?
@ExtendWith(MockitoExtension.class) 없이 @Mock 을 사용하면 Mock이 null로 남습니다. JUnit 5에서는 반드시 Extension을 추가하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.