본문 바로가기
Language/Java

[Library] Assertions

by 기몬식 2023. 11. 27.

Assertions

Assertions 는 Java 언어를 위한 라이브러리로 런타임 시점에 JDK 타입 검증 기능을 제공합니다.
AssertJ에 영감을 받아 제작했습니다.
2023년 11월 27일 기준 Maven Central Repository 에 1.0.0 버전으로 배포 되어 있습니다.

시작하기

Maven


<dependency>
    <groupId>io.github.ones1kk</groupId>
    <artifactId>assertions</artifactId>
    <version>1.0.0</version>
</dependency>

Gradle


implementation group: 'io.github', name: 'assertions', version: '1.0.0'

Gradle(short)


implementation 'io.github.ones1kk:assertions:1.0.0'

먼저 위와 같이 Maven, Gradle 두 가지 Build Tool을 통해 Assertions 라이브러리를 주입 받을 수 있습니다.

사용법

지정

먼저 검증 대상 객체를 지정합니다.
다음과 같은 문자열 배열이 있다고 가정하겠습니다.

String[] myBands = {"Led Zeppelin", "Guns N Roses", "Oasis", "Beatles"}

선언

Asserts 를 통해 대상을 검증하겠다는 메소드를 선언합니다.


Asserts.that(myBands);

포맷터 설정

기본적으로 라이브러리에서 제공하는 포맷터는 DefaultTextFormatter, SimpleTextFormatter 두 가지가 있으며 기본 설정은 SimpleTextFormatter로 되어있습니다.
포맷터는 Assertion 시 발생하는 에러 메세지를 출력하는 포맷을 정하는 메소드로 io.github.ones1kk.assertion.core.description.formatter.Formattable를 상속 받아 구현해야합니다.

다음은 각 포맷터가 출력하는 포멧입니다.

DefaultTextFormatter


  • 메세지, 검증 대상, 비교 대상 존재 시
    Expected    : expected
    Actual      : actual
    Description : description
  • 메세지, 검증 대상 존재 시
    Actual      : actual
    Description : description
  • 메세지만 존재 시
    Description : description

SimpleTextFormatter


  • 메세지, 검증 대상, 비교 대상 존재 시
    description(expected: expected actual: actual)
  • 메세지, 검증 대상 존재 시
    description(actual:  actual)
  • 메세지만 존재 시
    description

하지만 사용자가 직접 Formattalbe를 구현 받아 커스텀 포맷터를 등록할 수 있습니다.

class CustomFormat implements Formattable {
    ...override methods
}

그 후 configure() 메소드를 통해 적용합니다.

Asserts.that(myBands).configure(new CustomFormat())

configure() 메소드는 최초 that() 메소드 선언 시 사용 가능하며 이후로는 설정이 불가능합니다.

체이닝


Asserts.that(myBands)
    .configure(new CustomFormat())
    .isNotEmptyOrNull()
    .contains("Led Zeppelin");

이 후 JDK 타입에 따라 제공하는 메소드 체이닝하여 검증을 할 수 있습니다.

오류 메시지 설정

검증 시 에러가 발생한다면 기본적으로 설정한 에러 메세지가 출력이 됩니다.

io/github/ones1kk/assertion/core/message/** 이 경로에 각 타입에 맞춰 저장되어 있으며 따로 에러 메세지가 지정되지 않았다면 기본 에러 메세지가 콘솔에 출력됩니다.
하지만 사용자가 직접 지정한 에러 메세지를 출력하고 싶다면 as() 메소드를 이용합니다.

Asserts.that(myBands)
    .configure(new CustomFormat())
    .isNotEmptyOrNull()
    .as("Led Zeppelin은 꼭 있어야 돼!")
    .contains("Led Zeppelin");

위와 같이 as() 메소드를 선언한 시점부터는 기본 에러 메세지는 커스텀 에러 메세지로 오버라이딩 됩니다.
as() 메소드는 연속해서 사용할 수 있으며 이후 나오는 검증 스탭을 넘어갈 때마다 에러 메세지를 계속 오버라이딩합니다.

Asserts.that(myBands)
    .configure(new CustomFormat())
    .isNotEmptyOrNull()
    .as("Led Zeppelin은 꼭 있어야 돼!")
    .contains("Led Zeppelin")
    .as("Nirvana는 없어도 돼!")
    .doesNotContain("Nirvana");

또한 as() 메소드는 매개변수를 가질 수 있으며 사용법은 아래와 같습니다.

Asserts.that(myBands)
    .configure(new CustomFormat())
    .isNotEmptyOrNull()
    .as("Led Zeppelin은 꼭 있어야 돼!")
    .contains("Led Zeppelin")
    .as("Nirvana는 없어도 돼!")
    .doesNotContain("Nirvana")
    .as("나의 밴드는 총 {}개가 있어!", 4)
    .hasSize(4);

다만 매개변수를 사용할 때는 몇 가지 주의 사항이 있습니다. 내부적으로 String.format()을 사용하기 때문에 %s와 같은 특수문자는 사용 불가능하며 메세지에 중괄호({})가 있다면 매개변수는 필수로 들어가야하고 매개변수가 있는데 메세지에 {}가 없다면 오류를 내뱉습니다.


자세한 코드는 깃허브에서 확인 가능합니다.


오탈자 및 오류 내용을 댓글 또는 메일로 알려주시면, 검토 후 조치하겠습니다.