핵심 정리
class CalculatorTest {
@Test
void add_returnsSum() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}기본 흐름
어떤 테스트 요소를 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 테스트 메서드 표시 | @Test |
| 값 비교 | assertEquals(expected, actual) |
| 예외 검증 | assertThrows(...) |
| 테스트 준비 공통화 | @BeforeEach |
| 테스트 읽기 구조 | Arrange → Act → Assert |
JUnit 역할: 반복 가능한 검증 코드
JUnit은 "손으로 실행하고 눈으로 확인하던 과정"을 반복 가능한 자동 검증 코드로 바꿔 줍니다. 코드를 수정할 때마다 테스트를 실행해 기대 동작이 깨지지 않았는지 즉시 확인할 수 있습니다.
// 검증 없이 실행만 하는 코드 — 결과를 눈으로 봐야 함
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3)); // 직접 확인
// ✅ assertion으로 자동 검증
@Test
void add_returnsSum() {
assertEquals(5, calc.add(2, 3)); // 실패 시 자동 빨간불
assertEquals(0, calc.add(-1, 1));
}@Test와 assertion 활용
@Test는 테스트 메서드를 표시합니다. assertEquals, assertThrows, assertTrue, assertNotNull 같은 assertion은 기대 조건을 명시합니다. 예외가 발생해야 하는 경우도 assertThrows로 검증합니다.
@Test
void divide_throwsException_whenDivisorIsZero() {
Calculator calc = new Calculator();
assertThrows(ArithmeticException.class, () -> calc.divide(10, 0));
}
@Test
void findUser_returnsNull_whenNotFound() {
assertNull(repository.findById(999L));
}테스트 이름과 AAA 구조
좋은 테스트는 준비(Arrange) → 실행(Act) → 검증(Assert) 세 단계가 분명하게 읽힙니다. 테스트 이름은 "어떤 조건에서 어떤 결과가 나와야 하는가"를 드러내면 실패 시 원인 파악이 빠릅니다.
@Test
void deposit_increasesBalance_byDepositAmount() {
// Arrange
Account account = new Account(1000);
// Act
account.deposit(500);
// Assert
assertEquals(1500, account.getBalance());
}assertEquals vs assertThrows
반환값을 검증하는 테스트와 예외를 기대하는 테스트는 형태가 다릅니다. 예외가 정상 동작의 일부라면 try-catch로 직접 검사하기보다 assertThrows를 쓰는 편이 의도가 분명합니다.
// 반환값 검증
@Test
void add_returnsSum() {
assertEquals(5, calculator.add(2, 3));
}
// 예외 검증
@Test
void divide_throwsException_whenDivisorIsZero() {
assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
}체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 테스트 메서드 표시 | @Test |
| 값 비교 검증 | assertEquals(expected, actual) |
| 예외 발생 검증 | assertThrows(ExceptionClass, () -> ...) |
| null 여부 검증 | assertNull(...) / assertNotNull(...) |
| 여러 테스트 공통 준비 | @BeforeEach setUp 메서드 |
주의할 점
테스트 이름이 없거나 너무 짧으면 실패했을 때 원인을 찾기 어렵습니다. 의도를 이름에 담으세요.
// ❌ 이름에서 무엇을 테스트하는지 알 수 없음
@Test
void test1() {
assertTrue(calc.add(2, 3) == 5);
}
// ✅ 조건과 기대 결과가 이름에 담김
@Test
void add_withPositiveNumbers_returnsCorrectSum() {
// Arrange
Calculator calc = new Calculator();
// Act
int result = calc.add(2, 3);
// Assert
assertEquals(5, result, "2 + 3은 5여야 합니다");
}여러 조건을 println으로만 확인하면 테스트가 아니라 수동 체크가 됩니다.
// ❌ 실패해도 자동으로 알 수 없음
@Test
void add_manualCheck() {
System.out.println(calculator.add(2, 3));
}
// ✅ assertion으로 자동 검증
@Test
void add_returnsExpectedValue() {
assertEquals(5, calculator.add(2, 3));
}참고 링크
2 sources