PHpullh
학습 라이브러리/Java/JUnit 5 & Mockito

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을 추가하세요.