java
CHAPTER 80 / 99
읽기 약 2분
FUNCTION
JUnit 5 기초: 단위 테스트
핵심 개념
@Test·Assertions·@BeforeEach·파라미터화 테스트 — Service 레이어 단위 테스트.
본문
JUnit 5 기본
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 */ }
}파라미터화 테스트
@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 레이어 테스트
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
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