테스트 코드 작성법
BDD 스타일
- given : 어떤 상황이 주어졌을 때
- when : ~을 실행했을 때
- 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));
헷갈리기 쉬운 사용법
- 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의 기술 블로그:티스토리]