
테스트는 소프트웨어 개발의 중요한 과정 중 하나로, 코드의 품질을 보장하기 위해 정확하고 직관적인 검증이 필요합니다.
AssertJ는 자바 테스트에서 널리 사용되는 Assertion 라이브러리로, JUnit이나 TestNG와 함께 사용됩니다.
기존 assertEquals나 assertTrue 같은 단순한 검증 메서드보다 가독성과 유연성이 뛰어나며, 다양한 데이터 타입과 객체를 검증할 수 있도록 풍부한 API를 제공합니다.
import
import static org.assertj.core.api.Assertions.*;
static 임포트를 하면 테스트 시 편리하다.
가장 많이 쓰는 equal 비교 테스트의 경우, a = b 인지 알아보기 위해서 기존 코드 방식으로 assertEquals(a, b)를 사용하는 것보다, assertThat(a).isEqualTo(b)로 쓰는 것이 실문장에 가까워 가독성이 높고, 더 직관적인 코드가 될 수 있습니다.
기존 코드 (JUnit 방식):
@Test
void testStringWithJUnit() {
String actual = "abc";
assertEquals("abc", actual);
}
AssertJ 코드:
@Test
void testStringWithAssertJ() {
String actual = "abc";
assertThat(actual).isEqualTo("abc");
}
비교:
assertThat(actual).isEqualTo("abc")는 메서드 체이닝으로 더 읽기 쉽게 작성할 수 있습니다.AssertJ는 실패 메시지가 더 구체적이고 이해하기 쉽게 제공됩니다. 이는 디버깅을 효율적으로 만들어 주며, 문제를 빠르게 파악할 수 있게 도와줍니다.
JUnit (기존 코드):
@Test
void testStringWithJUnit() {
String id = "bcd";
assertTrue(id.contains("a"));
}
실패 시 출력되는 메시지:
expected: <true> but was: <false>
AssertJ (AssertJ 코드):
@Test
void testStringWithAssertJ() {
String id = "bcd";
assertThat(id).contains("a");
}
실패 시 출력되는 메시지:
Expecting:
<"abc">
to contain:
<"a">
비교:
expected와 actual 값만 비교되며, 오류의 원인에 대한 추가적인 정보는 부족합니다.Expected와 Actual 값을 명확하게 구분해 보여줍니다. id가 "a"를 포함할 것 이라고 기대했지만 그렇지 않다는 메세지 덕분에 실패한 원인을 보다 정확하게 알 수 있습니다.따라서, AssertJ는 실패 메시지가 구체적이고 디버깅을 더 쉽게 만들어 줍니다.
| 메서드 | 설명 | 예제 코드 |
|---|---|---|
isEqualTo(expected) | 값이 예상 값과 같은지 확인 | assertThat(actual).isEqualTo(42); |
isNotEqualTo(expected) | 값이 예상 값과 다른지 확인 | assertThat(actual).isNotEqualTo(10); |
isTrue() / isFalse() | 값이 true 또는 false인지 확인 | assertThat(actual).isTrue(); |
isNull() / isNotNull() | 값이 null인지 또는 아닌지 확인 | assertThat(actual).isNotNull(); |
contains(value) | 문자열이나 컬렉션에 값이 포함되는지 확인 | assertThat(actual).contains("Java"); |
doesNotContain(value) | 문자열이나 컬렉션에 값이 없는지 확인 | assertThat(actual).doesNotContain("Python"); |
hasSize(size) | 컬렉션 또는 배열의 크기를 검증 | assertThat(actual).hasSize(3); |
startsWith(prefix) | 문자열이 특정 접두사로 시작하는지 확인 | assertThat(actual).startsWith("Hello"); |
endsWith(suffix) | 문자열이 특정 접미사로 끝나는지 확인 | assertThat(actual).endsWith("World"); |
extracting(extractor) | 객체의 특정 속성을 추출하여 검증 | assertThat(actual).extracting(Person::getName).isEqualTo("John"); |
@Test
void testNumber() {
int actual = 42;
assertThat(actual)
.isGreaterThan(30)
.isLessThan(50)
.isPositive()
.isNotZero();
}
@Test
void testString() {
String actual = "AssertJ is powerful!";
assertThat(actual)
.startsWith("AssertJ")
.endsWith("powerful!")
.contains("is")
.doesNotContain("weak")
.matches(".*powerful!$");
}
@Test
void testCollection() {
List<String> actual = List.of("Java", "Spring", "AssertJ");
assertThat(actual)
.isNotEmpty()
.hasSize(3)
.contains("Spring")
.doesNotContain("Python")
.containsExactly("Java", "Spring", "AssertJ");
}
@Test
void testException() {
assertThatThrownBy(() -> {
throw new IllegalArgumentException("Invalid input");
})
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Invalid");
}
@Test
void testObject() {
Person person = new Person("John", 30);
assertThat(person)
.extracting(Person::getName, Person::getAge)
.containsExactly("John", 30);
}
AssertJ로 좀 더 간결하고 가독성 높은 테스트 코드를 편리하게 써봅시다. 🚀