반응형
해당 게시글은 위 글을 번역 및 테스트한 글이다.
1. AssertJ란?
Java Test를 다양하게 사용할 수 있는 오픈 소스 커뮤니티 중심 라이브러리
2. 소개
AssertJ의 클래스 및 유틸리티 메소드
- Standard Java
- Java 8
- Guava
- Joda Time
- Neo4J and
- Swing components
예시 코드
assertThat(frodo)
.isNotEqualTo(sauron)
.isIn(fellowshipOfTheRing);
assertThat(frodo.getName())
.startsWith("Fro")
.endsWith("do")
.isEqualToIgnoringCase("frodo");
assertThat(fellowshipOfTheRing)
.hasSize(9)
.contains(frodo, sam)
.doesNotContain(sauron);
maven dependency
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.4.1</version>
<scope>test</scope>
</dependency>
4. AssertJ 실행
4.1 시작하기
import static org.assertj.core.api.Assertions.*;
4.2 Assertions 작성하기
- 아래 문법만으로는 실제로는 아직 아무것도 주정하지 않아 실패하지 않는다.
assertThat(anyRefenceOrValue);
4.3 Object Assertion
- 두 개체의 동등성을 비교하거나 Object의 필드를 검사하기 위해 다양한 방법으로 비교할 수 있다.
public class Dog {
private String name;
private Float weight;
// standard getters and setters
}
Dog fido = new Dog("Fido", 5.25);
Dog fidosClone = new Dog("Fido", 5.25);
// 객체 참조 비교
assertThat(fido).isEqualTo(fidosClone);
// 객체의 필드 값 비교
assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);
4.4 Boolean Assertion
- isTrue()
- isFalse()
assertThat("".isEmpty()).isTrue();
4.5 Iterable/Array Assertions
- Iterable/Array에서 포함 관계 검색 방법
List<String> list = Arrays.asList("1", "2", "3");
assertThat(list).contains("1");
- List가 비어있지 않은 경우
assertThat(list).isNotEmpty();
- List가 “1”로 시작하는 경우
assertThat(list).startsWith("1");
- List가 비어있지 않고, 1을 포함하며 null을 포함하고 있지 않으며 “2”, “3”을 포함하는지 확인하는 방법
assertThat(list)
.isNotEmpty()
.contains("1")
.doesNotContainNull()
.containsSequence("2", "3");
4.6 Character Assertions
Character가 ‘a’와 동일하지 않고, 유니코드 테이블에 있으며 ‘b’보다 크고 소문자인지
assertThat(someCharacter)
.isNotEqualTo('a')
.inUnicode()
.isGreaterThanOrEqualTo('b')
.isLowerCase();
4.7 Class Assertions
클래스 유형에 대한 Assertion은 대부분 해당 필드, 클래스 유형, annotations의 존재 및 클래스의 완결성을 확인하는 것과 관련된다.
- Runnable 클래스가 인터페이스인지 확인
assertThat(Runnable.class).isInterface();
- Exception 클래스가 NoSuchElementException으로부터 할당 가능한지
assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);
4.8 File Assertions
파일 Assertions은 주어진 File이 존재하는지, 디렉토리 또는 파일인지, 특정 콘텐츠가 있는지, 읽을 수 있는지 또는 확장자가 있는지 확인한다.
- someFile이 존재하고 파일이며, Read Write 권한이 있는지
assertThat(someFile)
.exists()
.isFile()
.canRead()
.canWrite();
4.9 Double/Float/Integer Assertions
Numeric Assertions는 offset이 주어지거나 주어지지 않은 숫자를 비교한다. 예를 들어 주어진 정밀도(preecision)에 따라 두 값이 같은지 확인할 경우는 아래와 같이 할 수 있다.
assertThat(5.1).isEqualTo(5, withPrecision(1d));
4.10 InputStream Assertions
assertThat(given).hasSameContentAs(expected);
4.11 Map Assertions
Map Assertions를 사용하면 맵에 특정 항목, 항목 집합 도는 키/값이 별도로 포함되어 있는지 확인할 수 있다.
- 주어진 맵이 비어 있지 않은지, 숫자 키 ”2”를 포함하고, 숫자 키 “10”을 포함하지 않으며 key 2와 value “a”를 포함하는지 확인한다.
assertThat(map)
.isNotEmpty()
.containsKey(2)
.doesNotContainKeys(10)
.contains(entry(2, "a"));
4.12 Throwable Assertions
Trowable assertions은 예외 메시지, 스택 추적 검사, 예외가 이미 throw 되었는지 확인한다.
- 주어진 예외가 발생하고 “c”로 끝나는 메시지가 있는지 확인한다.
assertThat(ex).hasNoCause().hasMessageEndingWith("c");
5. 상세한 Assertions
더 상세한 내용의 Assertion을 작성하기 위해서는 “as”를 사용할 수 있다.
assertThat(person.getAge())
.as("%s's age should be equal to 100", person.getName())
.isEqualTo(100);
위와 같이 실행했을 때 아래와 같은 테스트 결과를 얻는다.
[Alex's age should be equal to 100] expected:<100> but was:<34>
6. Java 8
- Java 7에서 AssertJ 사용법
assertThat(fellowshipOfTheRing)
.filteredOn("race", HOBBIT)
.containsOnly(sam, frodo, pippin, merry);
- Java 8에서 AssertJ 사용법
- Java 8의 functional programming feature를 활용할 수 있다.
assertThat(fellowshipOfTheRing)
.filteredOn(character -> character.getRace().equals(HOBBIT))
.containsOnly(sam, frodo, pippin, merry);
7. Full TestCode
package study;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import javax.print.Doc;
import java.io.File;
import java.io.IOException;
import java.util.*;
import static java.util.Map.entry;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.withPrecision;
/**
* https://www.baeldung.com/introduction-to-assertj
* 아래 테스트는 위 AssertJ 문서의 테스트 코드이다.
*/
public class AssertJTest {
@Test
public void assertTest(){
// 아래 문법만으로는 실제로는 아직 아무것도 주정하지 않아 실패하지 않는다.
assertThat(100);
}
@Test
public void assertTestBoolean(){
// assertThat으로 Boolean 값을 비교할 수 있다.
assertThat("".isEmpty()).isTrue();
}
@Test
public void assertTestList(){
// Iterable/Array에서 포함 관계 검색 방법
List<String> list = Arrays.asList("1", "2", "3");
assertThat(list).contains("1");
// List가 비어있지 않은 경우
assertThat(list).isNotEmpty();
// List가 “1”로 시작하는 경우
assertThat(list).startsWith("1");
// List가 비어있지 않고, 1을 포함하며 null을 포함하고 있지 않으며 “2”, “3”을 포함하는지 확인하는 방법
assertThat(list)
.isNotEmpty()
.contains("1")
.doesNotContainNull()
.containsSequence("2", "3");
}
@Test
public void assertTestCharacter(){
// Character가 ‘a’와 동일하지 않고, 유니코드 테이블에 있으며 ‘b’보다 크고 소문자인지
Character someCharacter = 'c';
assertThat(someCharacter)
.isNotEqualTo('a')
.inUnicode()
.isGreaterThanOrEqualTo('b')
.isLowerCase();
}
@Test
public void assertThatClass(){
// Runnable 클래스가 인터페이스인지 확인
assertThat(Runnable.class).isInterface();
// Exception 클래스가 NoSuchElementException으로부터 할당 가능한지 확인
assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);
}
@Test
public void assertThatFile(){
// 파일 Assertions은 주어진 File이 존재하는지, 디렉토리 또는 파일인지, 특정 콘텐츠가 있는지, 읽을 수 있는지 또는 확장자가 있는지 확인한다.
File someFile = new File("file.txt");
try {
if(someFile.createNewFile()){
System.out.println("파일 생성 성공");
} else {
System.out.println("이미 존재하는 파일입니다.");
}
} catch (IOException e) {
System.out.println("파일 생성 시 에러 발생: " + e.getMessage());
}
assertThat(someFile)
.exists()
.isFile()
.canRead()
.canWrite();
}
@Test
public void assertNumeric(){
// Numeric Assertions는 offset이 주어지거나 주어지지 않은 숫자를 비교한다. 예를 들어 주어진 정밀도(preecision)에 따라 두 값이 같은지 확인할 경우는 아래와 같이 할 수 있다.
assertThat(5.1).isEqualTo(5, withPrecision(1d));
}
@Test
public void assertMap(){
// 주어진 맵이 비어 있지 않은지, 숫자 키 ”2”를 포함하고, 숫자 키 “10”을 포함하지 않으며 key 2와 value “a”를 포함하는지 확인한다.
Map<Integer, String> map = new HashMap<>();
map.put(2, "a");
assertThat(map)
.isNotEmpty()
.containsKey(2)
.doesNotContainKeys(10)
.contains(entry(2, "a"));
}
@Test
public void assertThrow(){
// 주어진 예외가 발생하고 “c”로 끝나는 메시지가 있는지 확인한다.
Exception ex = new Exception("c");
assertThat(ex).hasNoCause().hasMessageEndingWith("c");
}
@Test
public void assertThrowDetail(){
Integer age = 30;
String name = "Ela";
// 더 상세한 내용의 Assertion을 작성하기 위해서는 “as”를 사용할 수 있다.
assertThat(age)
.as("%s's age should be equal to 100", name)
.isEqualTo(100);
}
}
8. 참고자료
반응형
'개발 > Java' 카테고리의 다른 글
Java 14 Record Keyword (0) | 2024.11.22 |
---|---|
[Lombok][Warning] @Builder will ignore the initializing expression entirely. (0) | 2023.01.15 |
[Lombok][Warning] 상속받은 클래스에 @Data만 사용하면 Warning이 뜨는 이유 (0) | 2023.01.14 |
[Java] 인터페이스(Interface)란? (0) | 2020.07.14 |