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들을 연결하여 테스트를 수행할 수 있다. 이러한 테스트를 이용한 개발 방식은 구성 컴포넌트들을 연계 없이 빠르게 테스트 할 수 있도록 해주기 때문에 개발 속도가 빨라진다.