•
테스트와 관련된 많은 기능을 제공하고 메서드 체이닝을 통해 가독성 높은 테스트 코드 작성을 도와주는 오픈소스 라이브러리다.
•
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를 사용하면 모든 테스트를 실행한 후 실패 내역을 확인할 수 있다.
◦
SoftAssertions의 assertSoftly를 사용해서 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을 사용할 수 있다.