AssertJ란??
AssertJ는 풍부한 assertions 세트와 유용한 오류 메시지를 제공하고 테스트 코드 가독성을 향상시키며, IDE내에서 매우 쉽게 사용할 수 있도록 설계된 Java 라이브러리 입니다.
Junit5 에서 해당 라이브러리를 많이 사용합니다. 실제 Junit5 공식문서에 가면 이런 글이 있습니다.
JUnit Jupiter에서 제공하는 어설션 기능은 많은 테스트 시나리오에 충분하지만 더 많은 성능과 매처 와 같은 추가 기능 이 필요하거나 필요한 경우가 있습니다. 이러한 경우 JUnit 팀은 AssertJ , Hamcrest , Truth 등과 같은 타사 주장 라이브러리의 사용을 권장합니다.
지원되는 자바 버전
- AssertJ Core 3.x 에는 Java 8 이상이 필요
- AssertJ Core 2.x 에는 Java 7 이상이 필요
Maven
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<!-- use 2.9.1 for Java 7 projects -->
<version>3.23.1</version>
<scope>test</scope>
</dependency>
Gradle
testImplementation("org.assertj:assertj-core:3.23.1")
Spring을 사용하는 경우는 해당 의존성을 추가하면 AssertJ 가 포함되어 있다.
testImplementation 'org.springframework.boot:spring-boot-starter-test'
Assertions 클래스 진입점 사용(Use Assertions class entry point)
import static org.assertj.core.api.Assertions.*;
이 Assertions 클래스는 AssertJ 사용을 시작하는데 필요한 유일한 클래스이며 필요한 모든 메서드를 제공합니다.
바로 예제를 보겠습니다.
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
public class SimpleAssertionsExample {
@Test
void simple_assertions() {
assertThat("Hello, Assertions! good Test") //확인할 대상
.isNotNull() // 널이아닌가?
.startsWith("Hello") //"Hello" 로 시작하는가?
.contains("good") // "good"을 포함하는가?
.doesNotContain("Junit5") //"Junit5"를 포함하지않는가?
.endsWith("Test") //"Test"로 끝나는가?
.isInstanceOf(String.class); //"String class" 타입인가?
}
}
AssertJ는 메서드 체이닝을 사용하여 필요한 만큼 aseertion을 연결할 수 있어 코드가 깔끔하고 하나의 문장처럼 쉽게 읽을 수 있습니다.
모든 조건을 만족하여 테스트를 성공하게 되면 위와같이 아름다운 초록불이 들어오게 됩니다.
만약 실패를 하게 되면 어떻게 될까요?
public class SimpleAssertionsExample {
@Test
void simple_assertions() {
assertThat("Hello, Assertions! good Junit5 Test") // "Junit5" 추가
.isNotNull()
.startsWith("Hello")
.contains("good")
.doesNotContain("Junit5")
.endsWith("Test")
.isEqualTo("Hello, Assertions! good") //비교 문장 수정
.isInstanceOf(String.class);
}
}
검증하려고 하는 문장에 "Junit5" 를 추가하였습니다.
Junit5 는 포함되지 않아야 하는데 포함되었다고 에러가 납니다! 그런데 코드를 가만 보면 isEqualTo 에 적힌 문장과 본문 내용이 일치하지 않는데 위의 에러에 대한 정보는 출력하지 않습니다.
그 이유는 에러가 나게되면 그 즉시 종료를 하기 때문에 그 이후 검증메서드는 실행하지 않기때문입니다.
예외 테스트
public class SimpleAssertionsExample {
@Test
void assertExceptionTest() {
//exception assertion, 기본 스타일
assertThatThrownBy(() -> {throw new Exception("에러");}).hasMessage("에러");
// BDD 스타일
Throwable thrown = catchThrowable(() -> {
throw new Exception("에러!!!!!");
});
assertThat(thrown).hasMessageContaining("에러");
}
}
더 많은 예시들이 존재하는데 간단하게만 정리를 하여 공식문서를 참고하시면 더 도움이 되실 겁니다!
피해야할 AssertJ 사용법!
나쁜 사용 방법
// DON'T DO THIS ! It does not assert anything
assertThat(actual.equals(expected));
좋은 사용 방법
// DO THIS:
assertThat(actual).isEqualTo(expected);
// OR THIS (less classy but ok):
assertThat(actual.equals(expected)).isTrue();
나쁜 사용 방법
// DON'T DO THIS ! It does not assert anything and passes
assertThat(1 == 2);
좋은 사용 방법
// DO THIS: (fails as expected)
assertThat(1).isEqualTo(2);
// OR THIS (less classy but ok):
assertThat(1 == 2).isTrue();
[참고]
https://assertj.github.io/doc/#overview-what-is-assertj
'스프링' 카테고리의 다른 글
영한님 책에서 볼 수 없는 JPA (Hibernate) 내부 코드 살펴보기 (2) | 2023.03.14 |
---|---|
[HTTP] 로그아웃은 "GET" or "POST" ?? (0) | 2022.07.12 |
Builder Pattern (빌더 패턴) (0) | 2022.06.28 |
XSS 와 CSRF (0) | 2022.06.05 |
서블릿(Servlet) (0) | 2022.05.31 |