티스토리 뷰

개발 방식 연구/TDD

AssertJ vs. JUnit

kkoon9 2022. 1. 26. 18:24

스터디에서 대니스가 말씀해주시길, JUnit 내에 있는 Assertions보다는 AssertJ를 많이 사용한다고 말씀해주셨다.

그래서 이번엔 이 두 개의 차이점을 정리해보려고 한다.

해당 내용은 다음 링크를 번역한 내용이다.

AssertJ vs JUnit

우선, 간단하게 두 개의 차이점은 다음과 같다.

  • JUnit : 자바에 구축된 자동화 테스트가 가능한 프레임워크
  • AssertJ : 자바 테스트에서 유창하고 풍부한 assertions를 작성하는데 사용되는 오픈소스 라이브러리

물론, JUnit에서도 assertions가 가능하지만, AssertJ는 작업 과정을 더 효과적으로 만들고 코드를 더 잘 읽을 수 있게 만든다.

왜 AssertJ일까?

  • 배우기 쉽다.
    • AssertJ Docs 정리가 잘 되어 있다. ⇒ 링크는 아래 참고
  • 사용하기 쉽다.
    • 테스트 클래스에 dependency 및 static import만 추가하면 돼서 쓰기 간편하다.
  • fluent
    • 유창하다라는 뜻인데, 맞지 않는 것 같아서 그대로 가져왔다.
    • AssertJ는 여러분의 assertions를 다양화하는 데 도움을 준다.
  • 코드를 더 읽기 쉽다.
  • 자동 완성을 지원한다.
    • 따라서 모든 메서드 이름을 기억할 필요는 없다.

gradle dependency에 다음 코드를 추가하면 된다.

testImplementation 'org.assertj:assertj-core:3.13.2'

그 다음 테스트 코드에 static import를 통해 가져와서 사용하면 된다.

import static org.assertj.core.api.Assertions.*;

차이점을 코드로 알아보자.

다음은 JUnit5를 사용한 코드이다.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class JUnitTest {
    @Test
    public void testEqual() {
        Object object1 = new Object();
        Object object2 = object1;

        Assertions.assertEquals(object1,object2);
    }
}

다음은 AssertJ를 사용한 코드이다.

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;

public class AssertJTest {
    @Test
    public void testEqual() {
        Object object1 = new Object();
        Object object2 = object1;

        assertThat(object1).isEqualTo(object2);
    }
}

확실히 JUnit보다는 AssertJ가 더 직관적이다.

심지어 AssertJ는 as 메서드를 통해 에러 메시지까지 정의가 가능하다.

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;

public class AssertJTest {
    @Test
    public void testEqual() {
        Object object1 = new Object();
        Object object2 = object1;
        Object object3 = new Object();

        // failing assertion, with custom error message
        assertThat(object1).as("Checking whether objects are the same").isEqualTo(object3);
    }
}

Collection Test

Student라는 Class를 타입으로 가지는 Collection을 테스트하는 코드를 JUnit, AssertJ 둘다 살펴보자.

class Student {
    private String name;
    private int age;
		private int level;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

}

JUnit

Junit에서는 stream과 lambda를 사용하여 해결하였다.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StudentTest {
    @Test
    public void testStudentArrayList() {
        ArrayList<Student> characters = new ArrayList<>();
        Student frodo = new Student("Frodo", 32);
        Student aragorn = new Student("Aragorn", 62);
        Student sam = new Student("Sam", 36);
        characters.add(frodo);
        characters.add(aragorn);
        characters.add(sam);

        List<Student> expected = new ArrayList<>();
        expected.add(frodo);
        expected.add(aragorn);
        List<Student> filteredList = characters.stream()
                .filter((character) -> character.name.contains("o"))
                .collect(Collectors.toList());

        Assertions.assertEquals(expected,filteredList);

    }
}

조금은 복잡한 테스트 코드가 됐다.

AssertJ

다음은 AssertJ를 사용한 테스트 코드를 살펴보자.

import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;

public class StudentTest {
    @Test
    public void testStudentArrayList() {
        ArrayList<Student> characters = new ArrayList<>();
        Student frodo = new Student("Frodo", 32);
        Student aragorn = new Student("Aragorn", 62);
        Student sam = new Student("Sam", 36);
        
        characters.add(frodo);
        characters.add(aragorn);
        characters.add(sam);
        
        assertThat(characters)
					.filteredOn(character -> character.name.contains("o"))
					.containsOnly(aragorn, frodo);
        
    }
}

결론

AssertJ를 장려하자!

참고로, 위 글은 조금 옛날 글이라 JUnit5에 대해서 좀더 공부해보고 추가 블로깅하려고 한다.

AssertJ Docs

AssertJ - fluent assertions java library

'개발 방식 연구 > TDD' 카테고리의 다른 글

TDD 관련 글 정리  (0) 2022.02.13
AssertJ  (0) 2022.01.29
TDD [3]  (0) 2022.01.25
TDD [2]  (0) 2022.01.25
TDD [1]  (0) 2022.01.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함