Ian's Archive 🏃🏻

Profile

Ian

Ian's Archive

Developer / React, SpringBoot ...

📍 Korea
Github Profile →
Categories
All PostsAlgorithm19Book1C1CI/CD2Cloud3DB1DesignPattern9ELK4Engineering1Front3Gatsby2Git2IDE1JAVA7JPA5Java1Linux8Nginx1PHP2Python1React9Security4SpatialData1Spring26
thumbnail

AssertThat 정리

JAVA
2025.04.02.

Given - When - Then

Given-When-Then 패턴은 테스트 코드를 작성할 때 사용하는 구조화된 접근 방식이다.

이 패턴은 테스트 코드의 가독성을 높이고, 테스트 목적을 명확히 하는데 도움을 준다.

Given (준비)

  • 테스트를 위한 초기 상태와 조건을 설정하는 단계
    • 테스트에 필요한 객체를 생성하거나 변수 초기화
    • Mock객체를 설정하는 작업도 이 단계에서 수행

When (실행)

  • 테스트를 하고자 하는 실제 동작을 수행하는 단계
    • 일반적으로 테스트 대상 메서드를 호출
    • 보통 한 줄의 코드로 간단하게 표현

Then(검증)

  • 예상한 결과와 실제 결과를 비교
  • 주로 assert문을 사용하여 검증

장점

  1. 가독성 향상
  2. 유지보수성 개선
  3. 일관성 유지

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 사용하기

Previous Post
Modern Java In Action 3장 정리
Next Post
한입 크기로 잘라먹는 리액트
Thank You for Visiting My Blog, I hope you have an amazing day 😆
© 2023 Ian, Powered By Gatsby.