Spring

[ Spring ] AssertJ 정리 ( feat. 테스트 코드 작성하는 법 )

yebeen 2024. 2. 18. 17:03

테스트 코드 작성법

BDD 스타일

  1. given : 어떤 상황이 주어졌을 때
  2. when : ~을 실행했을 때
  3. then : 검증한 결과가 ~으로 나와야한다.
    ⇒ 3단계는 검증단계 : 실행 단계가 예상된 대로 동작하는지 검증
    ⇒ 1,2단계는 실행단계 : 사용자 입력을 모방해 테스트 로직 실행

 

AssertJ란?

assertion을 제공하는 자바용 단언문 라이브러리

Junit에서 제공하는 assertEQuals에 비해 에러 메세지와 테스트 코드의 가독성을 높여준다.

//junit
assertEquals(expected, actual); 
//AssertJ
assertThat(actual).isEqualTo(expected);

 

 

AssertJ import

정적 import를 하면 AssertJ의 다양한 API를 클래스 이름없이 사용 가능

import staic

 

 

Assertions.assertThat() or assertThat()란?

→ 특정 조건을 검증하기 위해 사용되며 예상되는 결과와 실제 결과를 비교하여 테스트를 수행한다.

→ 주로 단위 테스트나 통합 테스트에서 사용된다.

→ assertThat(테스트 타켓).메소드1().메소드2().메소드3();

 

 

예제 1. member와 findMember가 일치하는 객체인지 확인하기

[ isEqualTo()사용 ]

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class MemberServiceTest {
    MemberService memberService = new MemberServiceImpl();
    @Test
    void join(){
        Member member = new Member(1L,"memberA",Grade.VIP);
        memberService.join(member);
        Member findMember = memberService.findMemeber(1L);
        Assertions.assertThat(member).isEqualTo(findMember);
}

 

 

예제 2. “Java is a very interesting language.” 라는 문자열이 NULL이 아니고 Java로 시작하며 language.로 끝나는 것 을 검증하기

[ isNotNull(), startsWith(), endsWith() 사용 ]

@Test 
void simple_assertions() {
	Assertions.assertThat("Java is a very interesting language.").isNotNull() 
	.startsWith("Java")  
    .endsWith("language."); 
}

 

 

필터링하기

 

예제 1. list에서 이름에 a가 포함된 객체들만 필터링하고 그 객체를 검정하기

[ filteredOn(), containsOnly() ] 사용

@Test
    void filter_test() {
        List<Human> list = new ArrayList<>();
        Human kim = new Human("Kim", 22);
        Human park = new Human("Park", 25);
        Human lee = new Human("Lee", 22);
        Human amy = new Human("Amy", 25);
        Human jack = new Human("Jack", 22);

        list.add(kim);
        list.add(park);
        list.add(lee);
        list.add(amy);
        list.add(jack);

        assertThat(list).filteredOn(human -> human.getName().contains("a"))
                .containsOnly(park, jack);
    }

 

 

예제 2. 객체의 프로퍼티에 접근하여 값을 검증하기 - 나이가 25살인 객체 중 park과 lee만 있는지 확인

[ filteredOn(), containsOnly() ] 사용

@Test
    void filter_test2() {
        List<Human> list = new ArrayList<>();
        Human kim = new Human("Kim", 22);
        Human park = new Human("Park", 25);
        Human lee = new Human("Lee", 25);
        Human amy = new Human("Amy", 22);
        Human jack = new Human("Jack", 22);

        list.add(kim);
        list.add(park);
        list.add(lee);
        list.add(amy);
        list.add(jack);

        assertThat(list).filteredOn("age", 25).containsOnly(park, lee);
    }

 

 

예제 3. 나이가 22살이 아닌 객체들이 park과 lee로만 이루어져있는지 검증하기

[ filteredOn(), containsOnly() ] 사용

assertThat(list).filteredOn("age", notIn(25)).containsOnly(park, lee);

 

 

프로퍼티 추출하기

테스트를 위해 리스트의 객체들의 이름을 검증한다고 해보면
반복문에서 이름을 꺼내와 또 다른 리스트에 담고 비교하는 불편한 과정을 수반한다.

이를 해결하기위해 extraction()을 사용한다.

 

예제 1. 해당 정보들을 담고 있는지 확인

[ extracting(), contains() 사용 ]

assertThat(list).extracting("name").contains("Kim", "Park", "Lee", "Amy", "Jack");

//하나의 인자 검증 시 클래스를 명시하여 타입 검증을 강하게 할 수 있다.
assertThat(list).extracting("name", String.class).contains("Kim", "Park", "Lee", "Amy", "Jack");

//튜플도 가능하다.
assertThat(list).extracting("name", "age")
                .contains(tuple("Kim", 22),
                        tuple("Park", 25),
                        tuple("Lee", 25),
                        tuple("Amy", 22),
                        tuple("Jack",22));

 

 

헷갈리기 쉬운 사용법

  1. as()
    → assertion() 이전에 호출하여 사용하기
//올바른 코드
assertThat(actual).as("description").isEqualTo(expected);

//올바르지않은 코드
assertThat(actual).isEqualTo(expected).as("description");

 

 

   2. comparator()

         → assertion() 이전에 호출하여 사용하기

//올바른 코드
assertThat(actual).usingComparator(new CustomComparator()).isEqualTo(expected);

//올바르지않은 코드
assertThat(actual).isEqualTo(expected).usingComparator(new CustomComparator());

 

 


 

출처

인프런 김영한 스프링 핵심 원리 기본편

https://pjh3749.tistory.com/241 [JayTech의 기술 블로그:티스토리]