org.assertj.core.api.Assertions를 이용하는 테스트 코드 작성을 위해 AssertJ의 기본 작성법을 정리한다.
AssertJ
AssertJ는 Junit의 테스트 코드에 사용되고 테스트 코드의 가독성과 편의성을 더 높여주는 라이브러리이다.
AssertJ의 테스트 코드는 assertThat() 으로 시작한다. 또한 메서드를 연쇄적으로 호출해 테스트 코드를 작성할 수 있다.
Object 테스트
isEqualTo() 메서드는 객체의 참조를 비교한다. 객체의 필드를 비교하려면 usingRecursiveComparison() 메서드를 활용하면 된다.
- isNotSameAs(): 객체가 같은 지
- isSameAs(): 객체가 같은 지
- usingRecuresiveComparison(): 객체의 값 비교에 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public class Dog {
private String name;
private Float weight;
// getters and setters
}
@Test
void objectTest() {
Dog fido = new Dog("Fido", 5.25F);
Dog fidosClone = new Dog("Fido", 5.25F);
assertThat(fido).isNotSameAs(fidosClone);
// 참조는 다르기 때문에 NotSame
assertThat(fido).usingRecursiveComparison().isEqualTo(fidosClone);
// 객체의 값은 각각 같기 때문에 Equal
}
|
Boolean
- assertTrue() : 괄호 안의 반환 값이 True일 때
- assertFalse() : 괄호 안의 반환 값이 False 일 때
1
2
3
4
| @Test
void booleanTest() {
assertTrue("".isEmpty());
}
|
Class
클래스 타입은 보통 필드, 클래스 타입, 애노테이션 등을 확인할 때 사용한다.
- isInterface(): 특정 클래스가 인터페이스 인지 확인
- isAssignableFrom(): 특정 클래스가 다른 클래스에 할당 가능한 지 확인
- isInstanceOf(), isNotInstanceOf(): 실제 값이 주어진 유형의 인스턴스 인지 확인
1
2
3
4
5
6
7
8
| @Test
void classTest() {
Dog fido = new Dog("Fido", 5.25F);
assertThat(fido).isInstanceOf(Dog.class);
assertThat(Runnable.class).isInterface();
assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);
}
|
Exception
- assertThat 대신 assertThatThrownBy()를 사용한다.
- assertDoesNotThrow()
- assertThrows()
- assertThatNullPointerException()
1
2
3
4
5
6
7
8
9
| @Test
void exceptionTest() {
assertThatThrownBy( () -> { throw new Exception("boom!");} )
.isInstaceOf(Exception.class)
.hasMessageContaining("boom"); //예외 메시지에 특정 문자열이 포함되는 지 확인
assertThrows(IllegalArgumentException.class,
() -> inputValidator.validateInputName(overLengthNames));
}
|
Iterable/Array
- contains(): 요소 포함 여부 확인
- isNotEmpty(): Collection이 비어 있는지 확인
- startsWith(): 주어진 문자로 시작하는 지 확인
- 이 외 다양한 메서드
1
2
3
4
5
6
7
| @Test void arrayTest() {
List<String> list = Arrays.asList("1", "2", "3");
assertThat(list).contains("1");
assertThat(list).isNotEmpty();
assertThat(list).startsWith("1");
}
|
둘 이상의 assertion을 연결하여 확인하는 경우
1
2
3
4
5
6
7
8
9
| @Test void arrayTest() {
List<String> list = Arrays.asList("1", "2", "3");
assertThat(list).isNotEmpty()
.contains("1")
.doesNotContainNull()
.containsSequence("2", "3");
}
|
Character
- isNotEqualTo(), isEqualTo: 문자 비교
- isGreaterThanOrEqualTo(): 특정 문자보다 같거나 큰지 확인
- isLowerCase(): 소문자 인지 확인
1
2
3
4
5
6
| @Test
void characterTest() {
assertThat("s").isNotEqualTo("b")
.isGreaterThanOrEqualTo("c")
.isLowerCase();
}
|
Double/Float/Integer
- withPrecision(): 정밀도를 설정할 수 있다.
1
2
3
| void doubleTest() {
assertThat(5.1).isEqualTo(5, withPrecision(1d));
}
|
Map
- isNotEmpty(): Map이 비어있는 지 확인
- containsKey(): 특정 Key 포함 여부 확인
- doesNotContainsKey(): 특정 키 미포함 여부 확인
- contains(entry()): 특정 entry 포함 여부 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
| @Test
void mapTest() {
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
assertThat(map).isNotEmpty()
.containsKey(2)
.doesNotContainKeys(10)
.contains(entry(1, "a"));
}
|
File
파일 타입은 보통 파일의 존재 여부, 디렉터리/파일 여부, 컨텐츠 포함 여부 등을 확인할 때 사용한다.
- exists(): 파일 존재 여부
- isFile(): 파일 인지 여부
- canRead(): 읽기 가능 여부
- canWrite(): 쓰기 가능 여부
1
2
3
4
5
6
7
8
| @Test
void fileTest() {
assertThat(new File("/Users/aaron/Desktop/capture/test.jpeg"))
.exists()
.isFile()
.canRead()
.canWrite();
}
|