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에 추가된 Assumetion

모하니?/Coding : 2008.07.08 16:32


테스트 코드를 실행하는 환경이 달라짐에 따라서 테스트가 동작하지 않는 경우가 있는데, 그럴 때는 그런 환경 값들을 테스트를 돌리기 전에 설정해주면 테스트가 다시 잘 돌아갑니다. 예를 들어, 위도우에서는 폴더 구분할 때 \를 쓰지만 리눅스에서는 / 를 쓰고, 라인브레이크나 뭐 기타 표시들이 다를 수 있죠. 그런 경우 파일을 읽어오는 테스트가 있다면 운이 안 좋을 땐 테스트가 실패할 수도 있습니다.

그래서 그러한 "가정"을 실제로 코드로 미리 해두면, 그 테스트가 여러 환경에서 테스트를 하더라도 실패하는 일이 발생하진 않겠죠.

import static org.junit.Assume.*

@Test public void filenameIncludesUsername() {
   assumeThat(File.separatorChar, is('/'));
   assertThat(new User("optimus").configFileName(), is("configfiles/optimus.cfg"));
}

@Test public void correctBehaviorWhenFilenameIsNull() {
   assumeTrue(bugFixed("13356"));  // bugFixed is not included in JUnit
   assertThat(parse(null), is(new NullDocument()));
}

이런 식으로 사용할 수 있군요. 흠.. Stub을 만들고 그걸 Injection 해주는 걸까요.

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

ps : assumetion을 @Theory와 @Datapoint라는 것도 있는데 이건 좀 복잡해 보이네요. 패스~!
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


Eclipse가 빌드경로에 추가해주는 JAR 파일 바꾸기

Good Tools : 2008.01.09 00:32


스프링 2.5를 사용하시는 분들은 애노테이션 기반의 테스트를 작성하실 때 한 가지 귀찮은 에러를 맞닥드리게 되어 있습니다. 그건 바로 @RunWith라는 JUnit 애노테이션과 관련이 있습니다.

Spring-Test는 JUnit 4.4를 필요로 합니다. lib/junit 폴더에 가시면 junit4.4.jar 파일이 보이는 걸 보아 짐작할 수 있습니다. 그러나 Eclipse 3.3에서 기본으로 제공하는 JUnit은 4.3 버전입니다. 따라서 Eclipse가 빌드경로에 추가해주는 JUnit4를 사용하면 spring-test.jar가 사용해야 하는 라이브러리 버전이 아니기 때문에 에러가 발생합니다.

해결하는 방법은 간단합니다. Eclipse에서 자동완성으로 Junit 4를 넣지 않고 직접 lib/junit 폴더에 가서 jar 파일을 복사해서 넣어주면 됩니다.

이게 귀찮고 이전처럼 자동완성에서 JUnit 4를 빌드패스에 추가해서 사용하고 싶으신 분들은 한 번의 약간 큰 고생을 해주셔야 합니다.
사용자 삽입 이미지

바로 Eclipse 설치 폴더의 eclipse\plugins\org.junit4_4.3.1 폴더로 이동하셔서 그곳에 위치한 junit.jar 파일을 lib/junit 폴더의 junit4.4.jar 파일로 교채해 주는 것입니다. 물론 파일 이름도 junit4.4.jar 에서 junit.jar 로 바꿔줘야겠죠.
사용자 삽입 이미지

그러면 이제 이전처럼 퀵 픽스를 이용해서 JUnit4를 빌드패스에 추가하더라도 에러가 발생하지 않습니다.
사용자 삽입 이미지

이런 노가다도 Eclispe 3.4가 나오면 하지 않아도 될 것 같습니다.

이렇게 라이브러리 가지고 씨름을 하다보면 정말 Maven의 Archetype이 부러울따름입니다. 문제는 Maven을 처음 실행하고 첫 프로젝트의 Archetype 받을 때 시간이 너무 오래걸려서 탈입니다. pom.xml로 정의해둔 라이브러리들 마저 꼬이는 경우도 있고, 그냥 베이스 프로젝트 하나를 zip파일로 묶어 두던가 하는게 속편할 듯 합니다. 이상하게 얘기가 새고 있는데 이쯤에서 멈추고 자야겠습니다.

top