AssertJ를 사용해 테스트 코드를 작성해 보자
AssertJ는 Java 테스트를 위한 assertion 라이브러리이다. AssertJ의 장점을 간단하게 소개한 뒤, 사용법을 알아보고자 한다.
AssertJ의 장점
1. 가독성 높은 코드와 IDE 자동완성 지원
- 메서드 체이닝(이걸 만족하면서 저것도 만족하는지..)을 통해 사용자에게 직관적인 형태로 assertion을 작성할 수 있어 가독성이 크게 향상된다.
- IDE에서 체인할 메서드에 대해 자동 완성 기능을 제공하기 때문에 빠르고 정확한 코드 작성이 가능하고, 생산성을 크게 높일 수 있다.
2. 다양한 assertion 메서드
- 아래에서도 소개하겠지만 정~말 많은 메서드를 가지고 있기 때문에 다양한 상황에 대응할 수 있고, 복잡한 테스트 케이스를 간편하게 처리할 수 있다.
3. 상세한 에러 메시지 제공
- 테스트 실패 시 명확하고 구체적인 에러 메시지를 제공하기 때문에, 문제를 빠르게 파악하고 수정할 수 있다.
AssertJ 사용 방법
1-0. AssertJ import하기
import static org.assertj.core.api.Assertions.*;
1-1. assertThat
AssertJ의 핵심 메서드로, 테스트 대상 객체에 대한 다양한 검증을 수행할 수 있다.
assertion 부분이 메서드 체이닝을 하는 부분인데, 말 그대로 여러 조건을 만족하는지 검증이 가능하다.
assertThat(실제값).assertion(예상값);
아래는 사용 예시이다. 예시에서는 문자열을 예로 들었지만, 객체명.메서드명(입력값) 같이 객체의 메서드에 대한 결과값 검증에 많이 쓰인다.
String text = "Hello, World!";
assertThat(text)
.isNotNull()
.startsWith("Hello")
.endsWith("!")
.hasSize(13);
1-2. assertThat 메서드 정리
(1) 공통 메서드 (다양한 타입에 사용 가능)
- isEqualTo(Object expected): 값이 일치하는지 확인
- isNotEqualTo(Object expected): 값이 일치하지 않는지 확인
- isNull(): null인지 확인
- isNotNull(): null이 아닌지 확인
- isSameAs(Object expected): 동일한 객체 참조인지 확인
- isNotSameAs(Object expected): 다른 객체 참조인지 확인
- isIn(Object... values): 주어진 값들 중 하나인지 확인
- isNotIn(Object... values): 주어진 값들 중 어느 것도 아닌지 확인
- isInstanceOf(Class<?> type): 특정 클래스의 인스턴스인지 확인
- isExactlyInstanceOf(Class<?> type): 정확히 특정 클래스의 인스턴스인지 확인
(1) 문자열 관련 메서드
- isEmpty(): 빈 문자열인지 확인
- isNotEmpty(): 빈 문자열이 아닌지 확인
- startsWith(String prefix): 특정 문자열로 시작하는지 확인
- endsWith(String suffix): 특정 문자열로 끝나는지 확인
- contains(CharSequence... values): 특정 문자열을 포함하는지 확인
- doesNotContain(CharSequence... values): 특정 문자열을 포함하지 않는지 확인
- hasSize(int expected): 문자열의 길이 확인
- hasSizeGreaterThan(int expected): 문자열의 길이가 특정 값보다 큰지 확인
- hasSizeLessThan(int expected): 문자열의 길이가 특정 값보다 작은지 확인
(2) 숫자 관련 메서드
- isPositive(): 양수인지 확인
- isNegative(): 음수인지 확인
- isZero(): 0인지 확인
- isGreaterThan(T other): 특정 값보다 큰지 확인
- isLessThan(T other): 특정 값보다 작은지 확인
- isBetween(T start, T end): 두 값 사이에 있는지 확인
(3) 컬렉션 관련 메서드
- hasSize(int expected): 컬렉션의 크기 확인
- isEmpty(): 빈 컬렉션인지 확인
- isNotEmpty(): 빈 컬렉션이 아닌지 확인
- contains(T... values): 특정 요소를 포함하는지 확인
- containsExactly(T... values): 정확히 특정 요소들만 포함하는지 확인
- containsAnyOf(T... values): 주어진 요소들 중 하나라도 포함하는지 확인
- doesNotContain(T... values): 특정 요소를 포함하지 않는지 확인
(4) 참/거짓 관련 메서드
- isTrue(): true인지 확인
- isFalse(): false인지 확인
2. assertThatThrownBy
assertThat이 여러 조건을 만족하는지를 검증한다면, assertThatThrownBy는 예외 발생을 검증하는 데 사용된다.
assertThatThrownBy(() -> { })
.isInstanceOf(ExpectedException.class)
.hasMessageContaining("expected error message");
아래는 사용 예시이다. 오류를 throw 하는 부분에 예외가 발생해야 하는
객체명.메서드명(입력값) 을 넣어 시험한다.
assertThatThrownBy(() -> {
throw new IllegalArgumentException("Invalid argument");
})
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Invalid argument");