자바에서 애플리케이션 작성을 위한 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);
}
}