테스트 코드를 작성할 때 결과값이 예상과 일치하는지 검증하는 것을 Assertion이라고 한다.
Spring Boot에서는 spring-boot-starter-tes에 다양한 테스트 도구(JUnit, AssertJ, Mockito등)가 포함되어 있으며, 이 내부의Assertions 클래스를 주로 사용하게 된다.
spring-boot-starter-test 확인은 build.gradle에서 확인이 가능하다.

하지만 예시와 같이 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를 바로 사용할 수 있는 경우가 많다.

이전 글에서 사용한 라이브러리인 Mockito 또한 같이 존재한다.
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 사용을 권장한다.
'BackEnd > 자바 스프링' 카테고리의 다른 글
| [Java] Exception : 예외 처리 (0) | 2026.05.07 |
|---|---|
| [JAVA] Test code : 2. Service 통합 테스트 (TestContainers 적용) (0) | 2026.05.05 |
| [JAVA] Test code : 1. Service 단위 테스트 (0) | 2026.05.03 |
| [JAVA Spring] 트랜잭션 심화 (0) | 2026.04.01 |
| [Java Spring] Transaction (0) | 2026.03.22 |