OPEN HYPER STEP
← 목록으로 (Java+Spring)
JAVA · 80 / 99
java
CHAPTER 80 / 99
읽기 약 2
FUNCTION

JUnit 5 기초: 단위 테스트


핵심 개념

@Test·Assertions·@BeforeEach·파라미터화 테스트 — Service 레이어 단위 테스트.

본문

JUnit 5 기본

JAVA📋 코드 (30줄)
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {

    private Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    }

    @Test
    @DisplayName("덧셈 정상 동작")
    void add_positive_numbers() {
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    void divide_by_zero_throws() {
        ArithmeticException ex = assertThrows(
            ArithmeticException.class,
            () -> calculator.divide(10, 0)
        );
        assertTrue(ex.getMessage().contains("zero"));
    }

    @AfterEach
    void tearDown() { /* cleanup */ }
}

파라미터화 테스트

JAVA📋 코드 (31줄)
@ParameterizedTest
@ValueSource(ints = {1, 3, 5, 7, 9})
void odd_numbers(int n) {
    assertTrue(n % 2 == 1);
}


@ParameterizedTest
@CsvSource({
    "1, 1, 2",
    "2, 3, 5",
    "10, 20, 30",
})
void add_table(int a, int b, int expected) {
    assertEquals(expected, calculator.add(a, b));
}


@ParameterizedTest
@MethodSource("provideTestCases")
void from_method(String input, int expected) {
    assertEquals(expected, parseInt(input));
}

static Stream<Arguments> provideTestCases() {
    return Stream.of(
        Arguments.of("1", 1),
        Arguments.of("100", 100),
        Arguments.of("0", 0)
    );
}

Service 레이어 테스트

JAVA📋 코드 (16줄)
class UserServiceTest {

    @Test
    @DisplayName("이메일 중복 시 예외")
    void signup_duplicate_email_throws() {
        // given
        UserRepository mockRepo = mock(UserRepository.class);
        when(mockRepo.existsByEmail("alice@example.com")).thenReturn(true);

        UserService service = new UserService(mockRepo, mock(PasswordEncoder.class));

        // when & then
        assertThrows(DuplicateEmailException.class, () ->
            service.signup(new SignupDto("alice@example.com", "pass", "Alice")));
    }
}

AssertJ — 더 읽기 쉬운 assertion

JAVA📋 코드 (22줄)
import static org.assertj.core.api.Assertions.*;

@Test
void assertj_examples() {
    List<String> names = List.of("Alice", "Bob", "Charlie");

    assertThat(names)
        .hasSize(3)
        .contains("Alice")
        .doesNotContain("Dave");

    assertThat(names.get(0))
        .startsWith("A")
        .endsWith("e")
        .hasSize(5);


    User user = new User("Alice", 30);
    assertThat(user)
        .extracting("name", "age")
        .containsExactly("Alice", 30);
}

다음 챕터

CH.12 "Mockito" — 외부 의존성 격리.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 Spring 코드의 JUnit 5 단위 테스트 부분을 분석해서
테스트 커버리지·품질와 개선 우선순위를 알려줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

JUnit 5 단위 테스트 vs 다른 패턴 비교를
실전 사례 5개로 보여주고 JUnit 4 vs 5 vs Spock를 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 코드베이스 전체를 분석해서
JUnit 5 단위 테스트 관련 미테스트된 위험 코드를 보고해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 한국 기업의 JUnit 5 단위 테스트 채택률과
한국 SI/SaaS TDD 채택률를 솔직히 알려줘.

⭐ 이것만 기억하세요
JUnit 5 기초: 단위 테스트 이 3가지만 확실히 잡으세요
1.JUnit 5의 @ParameterizedTest로 같은 로직 여러 입력 테스트 — 테스트 코드 1/N 줄임
2.AssertJ는 fluent API로 더 읽기 쉬운 assertion + 풍부한 컬렉션 검증
3.다음 챕터 CH.12에서 Mockito — 외부 의존성 격리


공유하기
진행도 80 / 99