본문 바로가기
Development/Spring

Unit Test에서 AssertThat을 사용

by 메정 2021. 9. 23.

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. 유연성

anyOfallOf와 같은 논리 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 으로 사용하기

gd

참고

Unit Test에서 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

댓글