학습 테스트란?
보통 개발자는 자신이 만들고 있는 코드에 대한 테스트만 작성하면 되지만 때로는 자신이 만들지 않은 프레임워크나 다른 개발팀에서 제공한 라이브러리 등에 대해서도 테스트를 작성해야 한다. 이런 테스트를 학습 테스트라고 한다. 학습 테스트의 목적은 자신이 사용할 API나 프레임워크의 기능을 테스트로 보면서 사용 방법을 익히는 것이다.
학습 테스트 연습
JUnit은 테스트 메소드를 수행할 때마다 새로운 오브젝트를 만든다고 했다. 이에 대한 학습 테스트를 만들어보자. 먼저 새로운 테스트 클래스를 만들고 적당한 이름으로 세 개의 테스트 메소드를 추가하자. 테스트 클래스 자신의 타입으로 스태틱 변수를 하나 선언한다. 매 태스트 메소드에서 현재 스태틱 변수에 담긴 오브젝트와 자신을 비교해서 같지 않다는 사실을 확인한다.
public class JUnitTest {
static JUnitTest testObject;
@Test
public void test1() {
assertThat(this, is(not(sameInstance(testObject))));
testObject = this;
}
@Test
public void test2() {
assertThat(this, is(not(sameInstance(testObject))));
testObject = this;
}
@Test
public void test3() {
assertThat(this, is(not(sameInstance(testObject))));
testObject = this;
}
}
위의 코드를 실행해보면 테스트 성공으로 나온다. 하지만 이 코드는 직전의 객체끼리만 비교하는 문제점을 가지고 있다. test1에서 생성된 객체와 test3에서 생성된 객체가 서로 다르다는 것을 어떻게 확신할 수 있을까?
public class JUnitTest {
static Set<JUnitTest> testObjects = new HashSet<JUnitTest>();
@Test
public void test1() {
assertThat(testObjects, not(hasItem(this)));
testObjects.add(this);
}
@Test
public void test2() {
assertThat(testObjects, not(hasItem(this)));
testObjects.add(this);
}
@Test
public void test3() {
assertThat(testObjects, not(hasItem(this)));
testObjects.add(this);
}
}