Whiteship's Note


assertThat()으로 null 여부 확인하기

모하니?/Coding : 2008.07.30 14:34


JUnit 4.4 전에는 assertNotNull(dao); 이런식으로 확인했었습니다.

그러나 4.4부터 assertThat()을 사용해서 다음과 같이 테스트 할 수 있습니다.
assertThat(dao, is(notNullValue()));

여기서 is를 빼면 어법이 좀 그렇긴 하지만.. 그래도 동작합니다.
assertThat(dao, notNullValue());

처음엔 이렇게 작성했었습니다.
assertThat(dao, is(not(null));

하지만 위에 코드는 안 됩니다. null이 값이 아니기 때문에, 값 비교 하는데 null 때문에 NullPointerException이 발생합니다.

Maven을 사용하고 계시다면..

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.1</version>
        </dependency>

이렇게 라이브러리를 추가해주신 다음에 해야 합니다. static import를 추가해두면 편하겠죠.

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

top


JUnit 4.4에 추가된 assertThat()

모하니?/Coding : 2008.07.08 15:44


참조
http://junit.sourceforge.net/doc/ReleaseNotes4.4.html

흠.. 맨날 쓰는 메소드만 쓰다보니까, 새로운 기능들을 전혀 몰랐네요;
assertThat() 처럼 멋진 메소드를 이제야 알게 됐습니다.

보통 값을 비교할 때 assertEquals()를 사용해서

assertEquals(new Integer(2), game.getLeastTryCount());

이런식으로 값을 비교합니다. 메소드에 넘겨주는 첫 번째 인자가 기대값이고 뒤에 오는 인자가 실제 값인데, 사실  인자들의 순서가 바껴도 테스트 목적에는 별 다른 지장을 주지 않습니다. 위에서 테스트한 것과 동일한 내용을 assertThat()을 사용하여 다음과 같이 작성할 수 있습니다.

assertThat(game.getLeastTryCount(), is(2));

코드를 한 번 읽어보시죠. 훨씬 좋치 않나요? 위에서 사용한 is() 라는 메소드는 JUnit이 처음로 의존성을 가지고 사용하는 제 3자의 클래스들 입니다. Hamcrest라는 프로젝트 인데, Matcher를 확장한 다양한 메소드들을 제공해주고 있습니다. 그 중 하나가 is() 입니다. 따라서 import 문이 필요한데, 위에서 is만 사용한거 보니까 static import 겠거니.. 하고 짐작을 하셨겠죠?

import static org.hamcrest.CoreMatchers.*;

이렇게 추가해주시면 됩니다.

문장이 읽기 좋다는 장점 외에도 다음과 같은 장점들이 있습니다.
- 콤비네이션 가능. is(not(3)) 이나 eather(2).or(3) 같은 조합을 이뤄서 사용할 수 있음.
- assertEquals() 보다 더 가독성 높은 에러 메시지.
- 커스텀 매처 사용하능.

JUnit 4.4 가 제공하는 매처들
- org.hamcrest.CoreMatchers
- org.junit.matchers.JUnitMatchers.


top