Spring 환경 연동 테스트

Spring 환경과 테스트 연동하기

Spring MVC Project에서 테스트케이스를 작성할 때 기존에 만들어진 모듈과 연동이 필요할 경우 테스트 클래스에 추가적인 설정을 해야한다.

테스트 클래스 형태

테스트 클래스의 형태는 다음과 같다.

com.hakademy.spring11.Test05

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

  • @WebAppConfiguration

  • @ContextConfiguration

RunWith

JUnit 프레임워크에 테스트 실행기를 추가할 때 사용하는 애노테이션이다.

@RunWith(SpringJUnit4ClassRunner.class)

SpringJUnit4ClassRunner를 사용하면 테스트에 필요한 스프링 자원들을 관리하는 작업을 수행한다.

WebAppConfiguration

실제 프로젝트의 web.xml이 아닌 가상의 web.xml을 사용하기 위한 설정이다.

DispatcherServlet을 가상의 web.xml에 등록하여 사용할 수 있도록 구성하기 때문에 mvc관련된 설정들이 정상적으로 작동한다.

@WebAppConfiguration

ContextConfiguration

테스트 구동을 위해 필요한 설정을 등록하기 위한 애노테이션이다.

@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

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

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();
	}
	
}

실행 시 다음의 오류가 발생할 수 있다.

java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig

해결 방법은 servlet 모듈의 버전을 3.1 이상으로 업그레이드 하면 된다.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency> 

클래스 위에 작성된 애노테이션들을 지우고 테스트 수행시 오류가 발생하는 것을 확인할 수 있으며, 위와 같은 방식으로 Spring에서 사용하는 Bean들을 연결하여 테스트를 수행할 수 있다. 이러한 테스트를 이용한 개발 방식은 구성 컴포넌트들을 연계 없이 빠르게 테스트 할 수 있도록 해주기 때문에 개발 속도가 빨라진다.

Last updated