Search
Duplicate
🥘

AssertJ란?

테스트와 관련된 많은 기능을 제공하고 메서드 체이닝을 통해 가독성 높은 테스트 코드 작성을 도와주는 오픈소스 라이브러리다.
assertThat으로 시작하며 메서드 체이닝을 이용해 검증 메서드를 연쇄적으로 작성하여 테스트 코드를 가독성있게 유지해준다.
Assertions의 경우 JUnit4, 5도 지원을 한다.

Method

public SELF as
@Test public void test1() { String str = "가위"; assertThat(str).as("기대값 {바위}와 현재값 {%s}가 일치하지 않습니다.", str) .isEqualTo("바위"); }
Java
복사
String 타입의 description과 가변 인자(args)를 매개변수로 받는다.
테스트 코드의 실패 메시지를 설정할 수 있으며 검증 문보다 먼저 작성해야 한다. 이후에 작성할 경우 무시된다.
다음과 같이 Descriptable 인터페이스의 디폴트 메서드로 정의되어 있으며 AbstractIterableAssert라는 추상 클래스
public SELF filteredOn()
리스트에서 filteredOn 메소드를 이용해서 테스트할 데이터를 필터링할 수 있다.
총 5개의 오버로드 버전이 존재한다.
public SELF filteredOn(String propertyOrFieldName, Object expectedValue)
public SELF filteredOn(String propertyOrFieldName, FilterOperator<?> filterOperator)
public SELF filteredOn(Condition<? super ELEMENT> condition)
public <T> SELF filteredOn(Function<? super ELEMENT, T> function, T expectedValue)
public SELF filteredOn(Predicate<? super ELEMENT> predicate)
물론 체이닝 형태로 사용도 가능하다.
public AbstractListAssertextracting
@Test public void extracting() { assertThat(persons).extracting("name").contains("John", "Jane", "Bob"); assertThat(persons).extracting("name", "age").contains(tuple("John", "20"), tuple("Jane", "30"), tuple("Bob", "40")); }
Java
복사
객체 리스트에서 객체의 특정 필드들을 추출해내고 싶을 때 사용한다.
Soft Assertions
@Test public void softAssertions() { SoftAssertions soft = new SoftAssertions(); soft.assertThat(person1.getName()).isEqualTo("Jane"); // fail soft.assertThat(person1.getAge()).isEqualTo(30); // fail soft.assertAll(); SoftAssertions.assertSoftly(soft -> { soft.assertThat(person1.getName()).isEqualTo("Jane"); // fail soft.assertThat(person1.getAge()).isEqualTo(30); // fail } }
Java
복사
일반적으로 앞선 assertThat이 실패하는 경우, 이후의 해당 테스트는 즉시 중단되나 SoftAssertions를 사용하면 모든 테스트를 실행한 후 실패 내역을 확인할 수 있다.
SoftAssertionsassertSoftly를 사용해서 assertAll을 대체할 수 있다.
Excepiton Assertions
예외를 테스트하는 방법으로 크게 다음 2가지가 존재한다.
assertThatThrownBy
@Test public void exceptionTest1() { assertThatThrownBy(() -> { throw new Exception("boom!"); }).isInstanceOf(Exception.class) .hasMessageContaining("boom") .hasStackTraceContaining("Main.exception"); }
Java
복사
@Test public void exceptionTest3() { assertThatExceptionOfType(Exception.class).isThrownBy(() -> { throw new Exception("boom!"); }).withMessageContaining("boom") .withStackTraceContaining("Main.exceptionTest3"); }
Java
복사
assertThatThrownBy에 예외가 발생할 가능성이 있는 코드를 넘겨준 후 확인한다.
has~ 메소드를 통해 예외의 StackTrace, Message 등을 확인할 수 있다.
람다 표현식을 사용하므로 메소드 참조, 익명 클래스 모두 사용 가능하다.
catchThrowable
@Test public void exceptionTest2() { Throwable throwable = catchThrowable(() -> { throw new Exception("boom!"); }); assertThat(throwable).isInstanceOf(Exception.class) .hasMessageContaining("boom") .hasStackTraceContaining("Main.exceptionTest2"); }
Java
복사
catchThrowable에 예외가 발생하는 코드를 작성한 후, 위와 같이 넘기는 식이 있다.
Custom Comparison
isEqaulTo로 비교하는 경우, 참조가 같은 경우에만 테스트가 성공한다. 즉 동일성을 평가하는 것이다.
동등성을 평가하려면 usingComparator를 이용하여 원하는 Comparator를 넘겨주어야한다.
각 요소를 비교한다면 usingRecursiveComparison을 사용할 수 있다.