AssertJ란
AssertJ는 assertion을 제공하는 자바 라이브러리로 테스트 코드, 에러 메세지의 가독성을 높여준다.
JUnit5에서도 AssertJ와 비슷하게 값 검증을 할 수 있는 Assertions의 assert메소드들을 제공한다. 그럼 이 둘 간 차이점이 무엇인지 아래 코드를 먼저 보자.
assertEquals(expected, actual)
assertThat(actual).isEqualTo(expected)
코드를 보면 알 수 있듯 AssertJ에서 제공하는 assertion의 가독성이 더 높다.
AssertJ의 장점을 좀 더 구체적으로 알아보면 다음과 같다.
Java8 이상 기반 프로젝트는 3.x 버전을, Java7 이하 기반 프로젝트는 2.x 버전을 사용해야 한다.
Gradle
Java8
testCompile 'org.assertj:assertj-core:3.6.2'
Java7
testCompile 'org.assertj:assertj-core:2.6.0'
다음과 같이 정적 임포트를 하면 AssertJ의 다양한 API를 클래스 이름없이 바로 사용할 수 있다.
import static org.assertj.core.api.Assertions.*;
모든 테스트 코드는 assertThat() 메소드에서 출발한다. 다음과 같은 포멧으로 AssertJ에서 제공하는 다양한 메소드를 연쇄 호출 하면서 코드를 작성할 수 있다.
assertThat(테스트 타켓).메소드1().메소드2().메소드3();
JUnit에서 AssertJ로 contains 포함 여부 테스트
Java 에서 테스트 코드를 짤 때 특정 자료구조의 원소 값을 확인해야 하는 테스트가 있다.
반복문을 돌면서 일일히 확인해야 하거나 그냥 코드 한줄 한줄 입력하는 방법도 있지만 org.assertj.core.api.Assertions 에서 제공하는 assertThat().contains() 를 사용하면 좀 더 깔끔하게 확인할 수 있다.
사용 가능한 자료구조 : String, Array, Set, List 모두 사용 가능
결과가 contains의 매개변수를 포함하고 있는지 검사한다.
중복여부, 순서에 관계 없이 값만 일치하면 테스트가 성공한다.
결과에 포함되지 않은 값이 contains의 매개변수로 있으면 테스트는 실패한다.
단, 결과의 모든 값이 contains 매개변수에 있지 않아도 된다.
containsTest() {
val list = arraysOf(1,2,3)
// Success: 모든 원소를 입력하지 않아도 성공
assertThat(list).contains(1, 2);
// Success: 중복된 값이 있어도 포함만 되어 있으면 성공
assertThat(list).contains(1, 2, 2);
// Success: 순서가 바뀌어도 값만 맞으면 성공
assertThat(list).contains(3, 2);
// Fail: List 에 없는 값을 입력하면 실패
assertThat(list).contains(1, 2, 3, 4);
}
containsOnly 함수는 원소의 순서, 중복 여부는 무시하지만 원소값과 갯수가 정확히 일치해야 테스트가 통과된다.
/*
* containsOnly 실패 케이스
*
* assertThat(list).containsOnly(1, 2); -> 원소 3 이 일치하지 않아서 실패
* assertThat(list).containsOnly(1, 2, 3, 4); -> 원소 4 가 일치하지 않아서 실패
*/
@Test
void containsOnlyTest() {
val list = arraysOf(1,2,3)
assertThat(list).containsOnly(1, 2, 3);
assertThat(list).containsOnly(3, 2, 1);
assertThat(list).containsOnly(1, 2, 3, 3);
}
containsExactly 는 원소가 정확히 일치해야 한다.
중복된 값이 있어도 안되고 순서가 달라져도 안된다.
특정 자료구조의 정확한 값을 테스트 하고 싶은 경우에는 이 메소드를 사용할 수 있다.
/*
* containsExactly 실패 케이스
*
* assertThat(list).containsExactly(1, 2); -> 원소 3 이 일치하지 않아서
* assertThat(list).containsExactly(3, 2, 1); -> list 의 순서가 달라서 실패
* assertThat(list).containsExactly(1, 2, 3, 3); -> list 에 중복된 원소가 있어서 실패
*/
@Test
void containsExactlyTest() {
val list = arraysOf(1,2,3)
assertThat(list).containsExactly(1, 2, 3);
}
참고