스택큐힙리스트

JUnit5로 BankAccount 단위 테스트 작성법 본문

개발

JUnit5로 BankAccount 단위 테스트 작성법

스택큐힙리스트 2025. 7. 8. 15:59
반응형

목표 🔑

  • JUnit Jupiter(JUnit5) 환경 세팅 & 핵심 어노테이션 이해
  • BankAccount 클래스에 대한 단위 테스트 설계·구현
  • 예외 테스트로 입·출금 로직 신뢰도 높이기
  • assertAll·@Nested 등 실무에서 자주 쓰는 기능 체득

1. JUnit5 빠른 셋업

// build.gradle
testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
  • Gradle은 junit-jupiter 의존성 한 줄이면 끝.
  • Maven은 <artifactId>junit-jupiter-engine</artifactId> 사용.
  • IDE에서 “Run Tests”만 눌러도 자동으로 JUnit Platform이 실행된다.

2. 테스트 클래스 기본 골격

@DisplayName("BankAccount 단위 테스트")
class BankAccountTest {

    BankAccount account;

    @BeforeEach
    void setUp() {
        account = new BankAccount("철수", 100_000);
    }

    @Test
    @DisplayName("정상 입금")
    void depositSuccess() {
        account.deposit(50_000);
        assertEquals(150_000, account.getBalance());
    }
}
  • @BeforeEach : 테스트마다 초기 상태를 보장.
  • @DisplayName : 레포트에 한글 시나리오 그대로 노출 → 가독성 ↑
  • assertEquals : 예상값·실제값 비교.

3. 시나리오 설계 ✍️

  1. 정상 입금 → 잔액 증가 확인
  2. 정상 출금 → 잔액 감소 확인
  3. 잔액 초과 출금 시 예외 → IllegalStateException 던짐
  4. 0원 이하 입금 시 예외 → IllegalArgumentException 던짐
  5. 중복 검증 → assertAll 로 한 번에 결과 집계

4. 예외·복합 검증 코드

@Nested
@DisplayName("예외 상황")
class Exceptions {

    @Test
    @DisplayName("잔액 초과 출금은 불가")
    void withdrawOverBalance() {
        Throwable ex = assertThrows(IllegalStateException.class,
            () -> account.withdraw(200_000));
        assertEquals("잔액 부족", ex.getMessage());
    }

    @Test
    @DisplayName("0 이하 금액 입금은 불가")
    void depositInvalidAmount() {
        assertThrows(IllegalArgumentException.class,
            () -> account.deposit(0));
    }
}

@Test
@DisplayName("여러 검증을 한 번에")
void multipleAssertions() {
    account.deposit(10_000);
    account.withdraw(5_000);

    assertAll("입·출금 후 잔액과 로그 검사",
        () -> assertEquals(105_000, account.getBalance()),
        () -> assertTrue(account.getBalance() > 0)
    );
}
  • assertThrows 로 예외 타입·메시지 둘 다 체크.
  • @Nested 로 “예외 상황” 묶어 가독성 및 리포트 구조화.
  • assertAll 은 여러 단정 실패를 한꺼번에 보여 줘 디버깅 효율 ↑.

5. 실행 결과 살펴보기

콘솔을 보면

BankAccount 단위 테스트 ✓  
 예외 상황 ✓  
  잔액 초과 출금은 불가 ✓  
  0 이하 금액 입금은 불가 ✓  
 여�� 검증을 한 번에 ✓

체크가 뜨면 로직이 의도대로 동작! 실패 시 빨간 로그를 따라 원인 추적.


6. 현업 팁

  • assertThat(AssertJ)로 가독성-좋은 fluent API 사용 가능.
  • @ParameterizedTest 로 다양한 금액 데이터 드라이브 테스트.
  • Spring Boot 환경이라면 @SpringBootTest 대신 @WebMvcTest, @DataJpaTest 등 좁은 범위를 우선 고려하자.
  • CI 파이프라인(GitHub Actions)에서 ./gradlew test 단계 추가 → 회귀 버그 즉시 차단.
반응형
Comments