3.1 JUnit 단언

2021. 8. 13. 12:38JAVA/JUNIT

글의 목적

  • 햄크레스트(Hamcrest) 라이브러리를 활용하여 단언을 활용하는 방법 실습
  • 예외가 발생하는 테스트를 작성하는 방법 실습

3.1 JUnit 단언

JUnit에서 단언은 테스트에 넣을 수 있는 정적 메서드 호출입니다. 각각의 단언은 어떤 조건이 참인지 검증하는 방법입니다. 단언한 조건이 참(True)이 아니면 테스트는 그 자리에서 멈추고 실패를 보고합니다.

 

JUnit이 제공하는 두 가지 단언 스타일

  1. JUnit에서 기존 버전에 포함되어 있는 전통적인 단언 스타일(assertTrue, ... 등)
  2. 햄크레스트(Hamcrest) 라이브러리를 활용한 단언 스타일

햄크레스트란 무엇인가?

햄크레스트(Hamcrest)는 jMock이라는 Mock 라이브러리 저자들이 참여해 만들고 있는 Matcher 라이브러리입니다. 테스트 표현식을 작성할 때 좀 더 문맥적으로 자연스럽고, 우아한 문장을 만들 수 있게 도와줍니다.

 

3.1.1 assertTrue

테스트 표현식의 boolean 값이 True라고 예상을 하는 메소드입니다. 만약 테스트 표현식이 True가 아닌 False인 경우 테스트를 중단하고 오류를 알려줍니다.

 

   @Test
   public void hasPositiveBalance() {
      account.deposit(50);
      assertTrue(account.hasPositiveBalance());
   }


   @Test
   public void depositIncreasesBalance() {
      int initialBalance = account.getBalance();
      account.deposit(100);
      assertTrue(account.getBalance() > initialBalance);
   }

 

3.1.2 assertThat은 명확한 값을 비교

대부분의 단언은 기대하는 값과 반환된 실제 값을 비교합니다. 하지만 aseertThat은 명시적으로 기대하는 값을 단언합니다.

 

assertThat(account.getBalance(), equalTo(100));

assertThat() 정적 메서드는 햄크레스트 단언의 예입니다.

 

햄크레스트 단언 메소드 구성

  1. 첫번째 인자 : 실제 표현식, 즉 검증하고자 하는 값(종종 대상 시스템에 대한 메서드 호출)입니다.
  2. 두번째 인자 : 매처(matcher), 매처는 실제 값과 표현식의 결과를 비교합니다. 매처는 테스트의 가독성을 크게 높여줍니다.

햄크레스트 매치를 사용하기 위한 정적 임포트 추가

import static org.hamcrest.CoreMatchers.*;

 

equalTo 매처

  • equalTo 매처 메서드에는 어떤 자바 인스턴스나 기본형 값이라도 넣을 수 있습니다.
  • equalTo 매처는 비교 기준으로 equals() 메서드를 사용합니다.

 

3.1.3 중요한 햄크레스트 매처 살펴보기

1. equalTo()

값, 자바 배열 혹은 컬렉션 객체를 비교할 때 사용

@Test
   public void comparesCollectionsPassing() {
      assertThat(Arrays.asList(new String[] {"a"}), 
            equalTo(Arrays.asList(new String[] {"a"})));
   }

2. is 장식자(decorator)

is 장식자를 추가하여 매처 표현의 가독성을 높일 수 있습니다. is 장식자는 단지 넘겨받은 매처를 반환할 뿐 아무것도 하지 않습니다. 오직 개발의 가독성을 위하여 사용됩니다.

assertThat(account.getName(), is(equalTo("my big fat acct")));

 

3. not 매처

not 매처를 추가하여 어떤 것을 부정하는 단언을 만듭니다.

assertThat(account.getName(), not(equalTo("plunderings")));

 

4. nullValue(), notNullValue()

  • nullValue() : 테스트 표현식이 null값인지 비교
  • notNullValue() : 테스트 표현식이 not null인지 비교
assertThat(account.getName(), is(not(nullValue())));
assertThat(account.getName(), is(notNullValue()));

 

3.1.4. 부동소수점 수를 두 개 비교

isCloseTo 매처를 활용한 부동소수점 수 비교

	@Test
   	public void assertDoublesCloseTo() {
		assertThat(2.32 * 3, closeTo(6.96, 0.0005));
  	}

 

References

자바와 JUnit을 활용한 실용주의 단위 테스트
햄크레스트란 무엇인가? : https://blog.daum.net/jungjin1980/578
github : https://github.com/yonghwankim-dev/JUNIT-study/tree/main/iloveyouboss_13/test