질문 : setUp() 와 tearDown() 메소드가 final로 되어 있는 테스트 클래스들이 대부분인데요. 그럼 Spring의 Test API를 사용할 때는 JUnit에서 각 테스트를 위해 매번 세팅하거나 자원을 돌려줘야 할 땐 어떻게 하나요??

답변 :

사용자 삽입 이미지이 아래로 더 있을지도 모르겠지만 이 중에서 AbstractSpringContextTests 요거 부터 보겠습니다.

public class SpringTestTest extends AbstractSpringContextTests{

    @Override
    protected ConfigurableApplicationContext loadContext(Object arg0) throws Exception {
        throw new UnsupportedOperationException();
    }

    @Override
    protected void setUp() throws Exception {
        throw new UnsupportedOperationException();
    }

    @Override
    protected void tearDown() throws Exception {
        throw new UnsupportedOperationException();
    }
}

여기서는 JUnit의 setUp과 tearDown을 재정의 하여 사용할 수 있습니다.

그럼 한 단계 아래로 가서 AbstractSingleSpringContextTests를 보겠습니다. 어랏.. 여기서 부터는 위에서 사용한 setUp과 tearDown을 사용할 수 없습니다. final로 정의해 뒀네요.
사용자 삽입 이미지어라.. "그럼 우리는 무얼 사용해야 되죠~?" 위 그림에 보이는 onSetUp()과 onTearDown()을 사용하면 됩니다.

public class SpringTestTest extends AbstractSingleSpringContextTests{

    @Override
    protected void onSetUp() throws Exception {
        throw new UnsupportedOperationException();
    }

    @Override
    protected void onTearDown() throws Exception {
        throw new UnsupportedOperationException();
    }
}

따라서 AbstractSingleSpringContextTests 이 클래스 하위에 있는 테스트 클레스들은 전부 위의 메소드들을 사용해야겠군요~

위 가정에 해당하는 증명은 AbstractSingleSpringContextTests 클레스에 있는 소스코드 일부로 할 수 있습니다.

    protected final void setUp() throws Exception {
        this.applicationContext = getContext(contextKey());
        prepareTestInstance();
        onSetUp();
    }