spring webappconfiguration junit 테스트 클래스 전체에서 스프링 응용 프로그램 컨텍스트 재사용



spring test context (2)

우리는 많은 JUnit 테스트 케이스 (통합 테스트)를 가지고 있으며 논리적으로 다른 테스트 클래스로 그룹화되어 있습니다.

테스트 클래스 당 한 번씩 Spring 애플리케이션 컨텍스트를로드하고 http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html 언급 된대로 JUnit 테스트 클래스의 모든 테스트 케이스에 다시 사용할 수있다 http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html

그러나 JUnit 테스트 클래스의 한 번만 Spring 애플리케이션 컨텍스트를로드하는 방법이 있는지 궁금하다.

FWIW, Spring 3.0.5, JUnit 4.5를 사용하고 Maven을 사용하여 프로젝트를 빌드합니다.


Answer #1

예, 이것은 완벽하게 가능합니다. 테스트 클래스에서 동일한 locations 속성을 사용하기 만하면됩니다.

@ContextConfiguration(locations = "classpath:test-context.xml")

Spring은 locations 속성에 의해 애플리케이션 컨텍스트를 캐시하므로, 같은 locations 가 두 번째로 나타나면 Spring은 새로운 위치를 생성하는 대신 동일한 컨텍스트를 사용합니다.

이 기능에 대한 기사를 썼습니다 : Spring 통합 테스트 가속화 . 또한 Spring documentation의 9.3.2.1 Context management and caching 에 자세히 설명되어있다.

이것은 흥미로운 함의를 가지고 있습니다. Spring은 JUnit이 완료된 시점을 알지 못하기 때문에 모든 컨텍스트를 영원히 캐시하고 JVM 종료 후크를 사용하여 닫습니다. 이 동작 (특히 다른 locations 의 테스트 클래스가 많은 경우)은 과도한 메모리 사용, 메모리 누수 등을 초래할 수 있습니다. 캐싱 컨텍스트의 또 다른 장점은 다음과 같습니다.


Answer #2

Spring 3.2.2에서 Tomasz Nurkiewicz의 답변에 추가하려면 @ContextHierarchy 주석을 사용하여 별도의 관련 다중 컨텍스트 구조를 만들 수 있습니다. 이것은 여러 테스트 클래스가 (예를 들어) 메모리 내 데이터베이스 설정 (데이터 소스, EntityManagerFactory, tx 관리자 등)을 공유하고자 할 때 유용합니다.

예 :

@ContextHierarchy({
  @ContextConfiguration("/test-db-setup-context.xml"),
  @ContextConfiguration("FirstTest-context.xml")
})
@RunWith(SpringJUnit4ClassRunner.class)
public class FirstTest {
 ...
}

@ContextHierarchy({
  @ContextConfiguration("/test-db-setup-context.xml"),
  @ContextConfiguration("SecondTest-context.xml")
})
@RunWith(SpringJUnit4ClassRunner.class)
public class SecondTest {
 ...
}

이 설정을 사용하면 "test-db-setup-context.xml"을 사용하는 컨텍스트가 한 번만 생성되지만 내부의 bean은 개별 단위 테스트의 컨텍스트에 주입 될 수 있습니다

매뉴얼에 대한 추가 정보 : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management ( " 컨텍스트 계층 구조 "검색)





spring-test