BackEnd/자바 스프링

[JAVA] Test code : 0. Assertions

세모 2026. 5. 5. 00:49

테스트 코드를 작성할 때 결과값이 예상과 일치하는지 검증하는 것을 Assertion이라고 한다.

 

Spring Boot에서는 spring-boot-starter-tes에 다양한 테스트 도구(JUnit, AssertJ, Mockito등)가 포함되어 있으며, 이 내부의Assertions 클래스를 주로 사용하게 된다.

 

spring-boot-starter-test 확인은 build.gradle에서 확인이 가능하다.

프로젝트 dependencies 예시

하지만 예시와 같이 spring-boot-starter-test가 존재하지 않을 수 있는데

이런 경우는 다음과 같다.

  • spring-boot-starter-data-jpa-test가 존재할 때
  • spring-boot-starter-webmvc-test가 존재할 때

직접 spring-boot-starter-test를 추가하지 않더라도, @DataJpaTest나 @WebMvcTest 같은 슬라이스 테스트 라이브러리를 사용하면 의존성 전이(Transitive Dependency)를 통해 내부적으로 필요한 테스트 도구들이 함께 주입된다.

따라서 별도로 선언하지 않아도 AssertJ나 Mockito를 바로 사용할 수 있는 경우가 많다.

Spring-boot-starter-data-jpa-test 내부

이전 글에서 사용한 라이브러리인 Mockito 또한 같이 존재한다.


Assertions

사용할 수 있는 Assertions 클래스는 다음과 사진과 같이 두가지가 존재한다.

Assertions 클래스

JUnit

JUnit에서 제공하는 jupiter에서 사용하는 기본 Assertions이며 사용 예시는 다음과 같다.

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
////////////////
assertEquals(expected, actual);
////////////////
assertNotNull(name); 
assertTrue(name.startsWith("Fro"));
assertEquals("Frodo", name);
///////////////
assertThrows(IllegalArgumentException.class, () -> service.findById(-1L));

 

JUnit6 사용자 가이드 Third-party Assertion Libraries 항목을 보면 JUnit Jupiter에서  제공하는 Assertions 기능은 대부분 테스트 시나리오에 충분하지만 더 강력하고 추가적인 기능이 필요한 경우가 존재하며, 그런경우 Third-party사용하는 것을 권장한다.

그럼 왜 서드파티인 AssertJ가 필요한지 알아보자

  • assertEquals
    • 인자값의 순서 혼동이 발생할 수있다.
    • 결과 값과 기대 값을 반대로 작성하는 경우가 많음
  • 메서드 체이닝으로 한번에 검증 불가능
    • 현재 예시코드에서는 name에 대한 검증을 하기 위해 따로따로 작성했다.
  • 컬렉션 / 예외 검증
    • jupiter의 경우 예외 타입만 검증이 가능하다.
  • 이외에 불편한점
    • IDE 자동완성 : 타입 무관하게 범용 메서드만 존재하여 자동완성 사용이 까다롭다.
    • 실패 메시지 : 한줄에 작성되어 한번에 보기 힘들 가능성이 존재한다.

 

AssertJ

풍부한 Assertion을 제공하는 자바 라이브러리로, 테스트 코드의 가독성을 높이고 다양한 검증 기능을 지원한다.

 

특징은 다음과 같다.

  • Fluent API (메서드 체이닝) 지원
  • 명확한 인자 순서
  • 강력한 예외 검증
  • 컬렉션 검증
  • 객체 필드 검증
  • 명확한 실패 메시지

AssertJ에서 자주 사용되는 메서드는 다음과 같다.

// 기본 비교
assertThat(actual).isEqualTo(expected);
assertThat(actual).isNotEqualTo(other);

// null 체크
assertThat(result).isNotNull();
assertThat(result).isNull();

// boolean
assertThat(flag).isTrue();
assertThat(flag).isFalse();

// 문자열
assertThat(name).contains("test");
assertThat(name).startsWith("te");
assertThat(name).isBlank();

// 컬렉션
assertThat(list).hasSize(3);
assertThat(list).contains("a", "b");
assertThat(list).isEmpty();

// 예외
assertThatThrownBy(() -> service.method())
    .isInstanceOf(CustomException.class)
    .hasMessage("에러 메시지");
    
// 객체 검증
Member member = new Member("test@test.com", "nickname");

assertThat(member)
    .extracting("email", "nickname")
    .containsExactly("test@test.com", "nickname");

 


정리

항목 JUnit jupiter AssertJ
가독성 비교적 낮음 (인자 순서 헷갈림) 높음
에러 메시지 단순 비교 위주 상세한 분석 메세지 제공
IDE 자동완성 불편 편함
예외 검증 타입만 상세하게 설정 가능
확장성 기본적인 기능 컬렉션, 객체등 전용 검증 풍부

JUnit의 Assertions도 충분하지만, 가독성과 편의성을 위해 AssertJ 사용을 권장한다.