

AssertThat 정리
JAVA
2025.04.02.
Given - When - Then
Given-When-Then 패턴은 테스트 코드를 작성할 때 사용하는 구조화된 접근 방식이다.
이 패턴은 테스트 코드의 가독성을 높이고, 테스트 목적을 명확히 하는데 도움을 준다.
Given (준비)
- 테스트를 위한 초기 상태와 조건을 설정하는 단계
- 테스트에 필요한 객체를 생성하거나 변수 초기화
- Mock객체를 설정하는 작업도 이 단계에서 수행
When (실행)
- 테스트를 하고자 하는 실제 동작을 수행하는 단계
- 일반적으로 테스트 대상 메서드를 호출
- 보통 한 줄의 코드로 간단하게 표현
Then(검증)
- 예상한 결과와 실제 결과를 비교
- 주로 assert문을 사용하여 검증
장점
- 가독성 향상
- 유지보수성 개선
- 일관성 유지
1. assertThat
1.1) isEqualTo()
- 값이 정확히 일치해야 함
int sum = 5 + 6;
assertThat(sum).isEqualTo(11);
1.2) contains()
- 중복여부, 순서에 관계 없이 값만 일치하면 테스트가 성공
- String, Array, Set, List 모두 사용 가능
String str = "abc";
assertThat(str).contains("a", "b", "c");
int[] arr = {1, 2, 3, 4};
assertThat(arr).contains(1, 2, 3, 4);
Set<Integer> set = Set.of(1, 2, 3);
assertThat(set).contains(1, 2, 3);
List<Integer> list = Arrays.asList(1, 2, 3);
assertThat(list).contains(1, 2);
1.3) containsOnly();
- 순서, 중복을 무시하는 대신, 원소값과 갯수를 정확히 일치
assertThat(list).containsOnly(1, 2, 3);
assertThat(list).containsOnly(3, 2, 1);
assertThat(list).containsOnly(1, 2, 3, 3);
1.4) containsExactly()
- 순서를 포함하여 정확히 일치
List<Integer> list = Arrays.asList(1, 2, 3);
assertThat(list).containsExactly(1, 2, 3);
1.5) size()
assertThat(numbers).hasSize(3);
1.6 isTrue(), isFalse()
assertThat(result).isFalse();
2. assertEquals
@Test
void charAtTest() {
// Given
String input = "abc";
// When
char result = input.charAt(0);
// Then
assertEquals('a', result, "가장 첫번째 문자는 a이다");
}
3. assertThrows
// Given
String input = "abc";
// Then
assertThrows(StringIndexOutOfBoundsException.class, () -> input.charAt(-1), "벗어난 위치 조회 시 Exception발생");
4. assertThatExceptionOfType
// Given
String input = "abc";
// Then
assertThatExceptionOfType(StringIndexOutOfBoundsException.class)
// When
.isThrownBy(() -> {
input.charAt(-1);
})
.withMessageMatching("String index out of range: -\\d+"); // 예외 메시지 검증
5. @ParameterizedTest
@ParameterizedTest어노테이션을 테스트 메서드에 붙이면 다양한 변수를 하나의 테스트 코드로 테스트할 수 있게 된다.
@ValueSource - 여러값 주입하기
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void removeDuplicates(int num) {
assertThat(numbers).contains(num);
}
@EnumSource - Enum 주입하기
public enum ArticleType {
NOTICE, PROMOTION, NOVEL
}
@ParameterizedTest(name = "{index}번째 테스트 {0}")
@EnumSource(ArticleType.class)
void Enum_테스트(ArticleType articleType) {
log.info("{} 테스트 코드", articleType);
}
그 외 어노테이션
@CsvSource
@MethodSource
@NullSource
@EmptySource
@NullAndEmptySource
@ArgumentsSource
Reference
자바 플레이그라운드 with TDD, 클린 코드
JUnit 에서 AssertJ 로 contains 포함 여부 테스트
JUnit5 ParameterizedTest 사용하기