스프링

assertJ - 공식문서 기반 간단 정리

쿠쿠s 2022. 7. 8. 12:33

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