Quick Reference
class CalculatorTest {
@Test
void add_returnsSum() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}테스트 하나는 관찰 가능한 동작 하나를 검증하고, assertEquals는 expected, actual 순서로 씁니다. 실패 경로는 assertThrows로 예외 type과 필요하면 반환된 예외 instance의 message·cause까지 확인합니다.
기본 흐름
어떤 테스트 요소를 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 테스트 메서드 표시 | @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));
}실수 비교는 assertEquals(expected, actual, delta)처럼 허용 오차를 명시하고, 서로 독립적인 검증은 assertAll로 묶어 한 번 실행에서 여러 실패를 확인할 수 있습니다. assertThrows는 exception type만 확인하는 데 그치지 않고 반환된 exception instance의 message, cause, domain field를 검증할 수 있습니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 테스트 메서드 표시 | @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