테스트를 위한 애플리케이션 컨텍스트 관리
- 스프링은 JUnit을 사용하는 테스트 컨텍스트 프레임워크를 제공함.
스프링 테스트 컨텍스트 프레임워크 적용
- 스프링에서 제공하는 기능을 활용하여 다음과 같이 수정한다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(location=”/applicationContext.xml”)
public class UserDaoTest{
@Autowired
ApplicationContext context;
@Before
public void setUp(){...}
}
- @RunWith
- JUnit의 테스트 실행 방법 확장할 때 쓰는 애노테이션
- SpringJUnit4ClassRunner.class
- JUint이 테스트를 진행하는 중 테스트가 사용할 애플리케이션 컨텍스트 생성
- @ContextConfiguration
테스트 메서드의 컨텍스트 공유
- 하나의 테스트 애플리케이션 컨텍스트는 모든 테스트 메소드에서 공유된다.
- Spring의 JUnit 확장 기능은 테스트가 실행될 때 딱 한번 애플리케이션 컨텍스트를 생성함
- 테스트 오브젝트가 만들어질 때마다 특별한 방법으로 테스트 오브젝트의 특정 필드에 주입
테스트 클래스의 컨텍스트 공유
- 스프링은 여러 개의 테스트 클래스 사이에서 애플리케이션 컨텍스트를 공유해준다.
→ 수백 개의 테스트 클래스가 같은 설정 파일을 사용한다면, 하나의 애플리케이션 컨텍스트를 공유함.
@Autowired
-
스프링의 DI에서 사용되는 특별한 애노테이션
-
@Autowired가 붙은 인스턴스 변수가 있으면, 테스트 컨텍스트 프레임워크는 변수 타입과 일치하는 bean을 찾아서 주입해줌.
-
스프링 애플리케이션 컨텍스트는 초기화될 때 자기 자신을 bean으로 등록
→ 설정 파일에 명시하지 않아도 bean으로 존재하고 DI도 가능함.
단, @Autowired는 같은 타입의 bean이 두 개 이상 있으면 타입만으로 어떤 bean을 갖고올지 결정할 수 없다
- 이 때는 변수와 같은 이름을 가진 bean을 갖고 온다.
public class UserDaoTest{
@Autowired
SimpleDriverDataSource dataSource;
}
- 이런 식으로 작성하면, SimpleDriverDataSource 타입의 빈을 찾아서 주입한다.
- 그냥 DataSource 타입의 변수를 Autowired 하는 것도 좋지 않을까?
- 이런 경우에는, SimpleDriverDataSource 자체가 필요한지 아니면 DataSource가 필요한지에 따라서 다르게 생각해야 한다.