Spring 환경과 테스트 연동하기
Spring MVC Project에서 테스트케이스를 작성할 때 기존에 만들어진 모듈과 연동이 필요할 경우 테스트 클래스에 추가적인 설정을 해야한다.
테스트 클래스 형태
테스트 클래스의 형태는 다음과 같다.
com.hakademy.spring11.Test05
Copy package com . hakademy . spring11 ;
import org . junit . runner . RunWith ;
import org . springframework . test . context . ContextConfiguration ;
import org . springframework . test . context . junit4 . SpringJUnit4ClassRunner ;
import org . springframework . test . context . web . WebAppConfiguration ;
@ RunWith ( SpringJUnit4ClassRunner . class )
@ WebAppConfiguration
@ ContextConfiguration (locations = {
"file:src/main/webapp/WEB-INF/spring/root-context.xml" ,
"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
})
public class Test05 {
... (생략) ...
}
클래스 위에 다음 설정이 추가된다.
RunWith
JUnit 프레임워크에 테스트 실행기를 추가할 때 사용하는 애노테이션이다.
Copy @ RunWith ( SpringJUnit4ClassRunner . class )
SpringJUnit4ClassRunner를 사용하면 테스트에 필요한 스프링 자원들을 관리하는 작업을 수행한다.
WebAppConfiguration
실제 프로젝트의 web.xml이 아닌 가상의 web.xml을 사용하기 위한 설정이다.
DispatcherServlet을 가상의 web.xml에 등록하여 사용할 수 있도록 구성하기 때문에 mvc관련된 설정들이 정상적으로 작동한다.
ContextConfiguration
테스트 구동을 위해 필요한 설정을 등록하기 위한 애노테이션이다.
Copy @ ContextConfiguration (locations = {
"file:src/main/webapp/WEB-INF/spring/root-context.xml" ,
"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
})
file:src/main/webapp/WEB-INF/spring/root-context.xml
file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
클래스 설정이 존재할 경우에도 설정이 가능하지만, component-scan으로 스캔이 가능하기 때문에 두 설정파일만 추가해도 기본적인 연동 테스트를 수행할 수 있다.
연동을 위한 테스트 클래스 생성
테스트케이스에서 사용할 클래스를 생성한 뒤 스프링 설정에 등록한다.
이 프로젝트에서는 @Component 를 이용하여 클래스를 등록하도록 한다.
src/main/java : com.hakademy.spring11.component.TestComponent
Copy package com . hakademy . spring11 . component ;
import org . springframework . stereotype . Component ;
@ Component
public class TestComponent {
public void run () {
System . out . println ( "테스트 컴포넌트 run 메소드 실행" );
}
}
@Autowired 애노테이션으로 등록된 컴포넌트를 가져와서 테스트를 수행한다.
src/test/java : com.hakademy.spring11.Test05.java
Copy package com . hakademy . spring11 ;
import org . junit . Test ;
import org . junit . runner . RunWith ;
import org . springframework . beans . factory . annotation . Autowired ;
import org . springframework . test . context . ContextConfiguration ;
import org . springframework . test . context . junit4 . SpringJUnit4ClassRunner ;
import org . springframework . test . context . web . WebAppConfiguration ;
import com . hakademy . spring11 . component . TestComponent ;
@ RunWith ( SpringJUnit4ClassRunner . class )
@ WebAppConfiguration
@ ContextConfiguration (locations = {
"file:src/main/webapp/WEB-INF/spring/root-context.xml" ,
"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
})
public class Test05 {
@ Autowired
private TestComponent component;
@ Test
public void test () {
component . run ();
}
}
실행 시 다음의 오류가 발생할 수 있다.
Copy java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
해결 방법은 servlet 모듈의 버전을 3.1 이상으로 업그레이드 하면 된다.
Copy <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
클래스 위에 작성된 애노테이션들을 지우고 테스트 수행시 오류가 발생하는 것을 확인할 수 있으며, 위와 같은 방식으로 Spring에서 사용하는 Bean들을 연결하여 테스트를 수행할 수 있다. 이러한 테스트를 이용한 개발 방식은 구성 컴포넌트들을 연계 없이 빠르게 테스트 할 수 있도록 해주기 때문에 개발 속도가 빨라진다.