본문 바로가기
Test Code

[JUnit] assertj 활용한 테스트 코드 작성

by bkuk 2023. 4. 12.
해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다.

 

contains(String values)

  • 배열로 반환하는 값의 경우 assertj의 contains()를 활용해 반환 값이 맞는지 검증
@Test
void split1() {
    String actual = "1,2";
    String[] actualSplit = actual.split(",");
    assertThat(actualSplit).contains("1");
    assertThat(actualSplit).contains("2");
}

 

containsExactly(String values)

  • 배열로 반환하는 값의 경우 assertj의 containsExactly()를 활용해 반환 값이 맞는지 검증
@Test
void split2() {
    String actual = "1";
    String[] actualSplit = actual.split(",");
    assertThat(actualSplit).containsExactly("1");
}

 

Exception별 메서드

  • chatAt() 메서드는 특정 위치의 문자를 가져올 때, 위치가 벗어나면 Exception(StringIndexOutOfBoundsException)을 발생시킨다.
  • 이에 대한 학습 테스트를 구현한다. 아래는 JUnit에서 Exception별 제공하는 메서드
    • assertThatIllegalArgumentException()
    • assertThatIllegalStateException()
    • assertThatIOException()
    • assertThatNullPointerException()
@Test
@DisplayName("문자열의 최대 인덱스인 length() - 1 보다 큰 index를 통해 문자를 가져올때 발생하는 Exception 테스트")
void chatAt2() {
    String actual = "abc";
     assertThatExceptionOfType(StringIndexOutOfBoundsException.class)
     .isThrownBy(() -> { actual.charAt(actual.length());})
     .withMessageMatching(String.format("String index out of range: %s", actual.length()));
}

 

ParameterizedTest를 활용한 중복 코드 제거

  • Set의 contains() 메서드를 활용해 1,2,3 의 값이 존재하는지 확인하는 테스트
  • assertThat(numbers.contains(1)).isTrue(); 
  • assertThat(numbers.contains(2)).isTrue();
  • ..
  • 반복되는 코드로 인해서 ParameterizedTest 어노테이션을 활용한 중복 코드 제거
@BeforeEach
void setUp() {
    numbers = new HashSet<>();
    numbers.add(1);
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);
}

@ParameterizedTest
@ValueSource(ints = {1,2,3})
void contains(int number) {
    assertTrue(numbers.contains(number));
}

 

ParameterizedTest와 CsvSource 어노테이션을 활용한 테스트

  •  입력 값에 따라 결과 값이 다른 경우에 대한 테스트도 가능하도록 구현
  • 예를 들어 1, 2, 3 값은 contains 메소드 실행결과 true, 4, 5 값을 넣으면 false 가 반환되는 테스트를 하나의 Test Case로 구현
@ParameterizedTest
@CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':')
void contains(int input, Boolean expected) {
    assertThat(numbers.contains(input)).isEqualTo(expected);
}