JUnit 4.4 부터는 asswerThat 메서드가 추가됨
asswerThat 이 좋은 점
1. 가독성
두 값을 비교할 때 주로 assertEquals를 사용할 수 있음. 그러나 asswerThat을 이용하면 인자의 위치를 명확하게 알 수 있음
// 두 객체가 같은 값인지
assertEquals(expected, actual);
assertThat(actual, is(expected));
// 두 객체가 다른 값인지
assertFalse(expected.equals(actual));
asserThat(actual, is(not(expected)));
2. 더 나은 Failure 메시지
ex.
assertTrue(expected.contains(actual));
--- 실행 결과 ---
java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:86)
at org.junit.Assert.assertTrue(Assert.java:41)
at org.junit.Assert.assertTrue(Assert.java:52)
assertThat(actual, containsString(expected));
--- 실행 결과 ---
Expected: a string containing "expected"
but: was "actual"
java.lang.AssertionError:
Expected: a string containing "expected"
but: was "actual"
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
원인을 찾기 위해 별도의 디버깅 필요없이 에러 메세지만으로 잘못된 부분을 파악할 수 있다.
3. Type의 안전성
assertEquals("abc", 123); // 컴파일에는 성공하지만, 실행시 실패
---- assertEquals의 구현체 ----
static public void assertEquals(Object expected, Object actual) {
assertEquals(null, expected, actual);
} //Object로 인자를 받음
assertThat(123, is("abc")); // 컴파일 실패
---- assertThat의 구현체 ----
public static <T> void assertThat(T actual, Matcher<? super T> matcher) {
assertThat("", actual, matcher);
} //Generic(T)를 인자로 받아서 Type 체크됨
4. 유연성
anyOf
와 allOf
와 같은 논리 matcher도 제공
allOf
: and 연산자처럼 동작
assertThat("test", allOf(is("test2"), containsString("te")));
//test2와 te에 대한 is()와 containsString()이 ture인 경우에 테스트 통과, 실패 시 에러 반환
---- 에러 메세지 ----
Expected: (a string containing "te" and is "test2")
but: is "test2" was "test"
java.lang.AssertionError:
Expected: (a string containing "te" and is "test2")
but: is "test2" was "test"
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
사용하기 위해서 import
import static org.assertj.core.api.Assertions.assertThat;
asssetXXX → assertThat 으로 사용하기
참고
'Development > Spring' 카테고리의 다른 글
java.util.Optional T 클래스 (0) | 2021.09.23 |
---|---|
Java Optional 바르게 쓰기 (0) | 2021.09.23 |
테스트 코드 작성 시 유의사항 (0) | 2021.09.23 |
@Validation 어노테이션 (0) | 2021.09.23 |
빠르게 실패 vs 안전하게 실패 (0) | 2021.09.23 |
댓글