Spring Core/자질구래

[spring]junit 과 spring legacy project 연동 시키기

은서파 2021. 12. 1. 09:27

자바에서 애플리케이션 작성을 위한 Spring Framework와 단위테스트를 위한 JUnit을 연동해서 사용하는 방법에 대해 살펴보자.

 

의존성 설정

테스트를 위해서는 junit과 spring-test에 대한 의존성 설정이 필요하다.

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.13.2</version>
	<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>${org.springframework-version}</version>
	<scope>test</scope>
</dependency>

 

연동 처리를 위한 annotation 사용

 

junit의 @RunWith

@RunWith는 JUnit이 동작할 때 내장된 runner가 아닌 사용자 지정의 runner와 동작 할 수 있게 지정해주는 녀석이다. 이 부분이 바로 spring framework와의 연동 부분이 된다.

@RunWith(SpringRunner.class)

이때 사용할 runner는 SpringRunner.class이다.

spring의 @ContextConfiguration

다음으로 스프링 프레임워크에서 읽어들일 설정 파일을 등록해주어야 한다. 이때 @ContextConfiguration을 사용한다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ContextConfiguration {
	@AliasFor("locations")
	String[] value() default {};
	@AliasFor("value")
	String[] locations() default {};
	Class<?>[] classes() default {};   
	Class<? extends ApplicationContextInitializer<?>>[] initializers() default {};
	boolean inheritLocations() default true;
	boolean inheritInitializers() default true;
	Class<? extends ContextLoader> loader() default ContextLoader.class;
	String name() default "";
}

annotation의 여러가지 속성 중 가장 많이 사용되는 것은 설정 파일의 위치를 지정하는 locations이다. locations에 그냥 경로를 입력하면 클래스 패스 경로상에 있는 xml 파일을 로딩하고 만약 프로젝트에는 있지만 클래스 패스에는 없는 경우(예를 들어 webapp/WEB-INF/ 등에 있는 경우)는 file:을 통해서 접근해야 한다.

@ContextConfiguration({"/classpath-context.xml", 
                       "file:src/main/webapp/WEB-INF/spring/root-context.xml"})

만약 java 기반의 환경 설정을 사용한다면 classes 속성을 이용해서 로딩한다.

@ContextConfiguration(classes = MyApplicationContext.class)

자바 기반으로 작성하면 자동완성도 지원되기 때문에 오타의 위험도 없고 역시 깔끔하다.

 

간단한 사용

연결이 되었다면 이제부터는 일반적인 JUnit 처럼 사용하면 된다.

import static org.junit.Assert.assertNotNull;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

// 1. spring과 junit을 연동시키자.
@RunWith(SpringRunner.class)
// 2. 환경 설정을 어디서 가져올까요?
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class BeanTest {

	@Autowired
	ApplicationContext ctx;
	@Autowired
	DataSource ds;

	@Test
	public void beanTest() {
		assertNotNull(ctx);
		assertNotNull(ds);
	}
}