2011-12-14 2 views
54

JUnit 테스트 케이스 (통합 테스트)가 여러 개 있으며 논리적으로 다른 테스트 클래스로 그룹화되어 있습니다. 할 수있는 방법이 있다면 우리는 테스트 클래스에 한 번 Spring 애플리케이션 컨텍스트를로드하고 그러나 http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.htmljunit 테스트 클래스 전체에서 스프링 응용 프로그램 컨텍스트를 다시 사용하십시오.

에 언급 된 JUnit 테스트 클래스의 모든 테스트 케이스를 위해 그것을 다시 사용할 수 있습니다

, 우리는 그냥 궁금했다 여러 개의 JUnit 테스트 클래스에 대해 한 번만 Spring 애플리케이션 컨텍스트를로드한다.

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

+0

아래 답변의 모든 중대하다,하지만 난의 context.xml이없는 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management ("context hierarchy"에 대한 검색). 나는 망각에 자신의 길에 주석을 달았습니까? context.xml없이이 작업을 수행하는 방법은 무엇입니까? – markthegrea

답변

67

예, 가능합니다. 같은 locations이 두 번째로 나타나는 경우, 봄이 만드는 대신 같은 컨텍스트를 사용하므로 locations 속성에 의해

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

봄 캐시 응용 프로그램 컨텍스트 : 당신이해야 할 모든 테스트 클래스에서 같은 locations 속성을 사용하는 것입니다 새로운 것.

이 기능에 대한 기사를 작성했습니다 : Speeding up Spring integration tests. 또한 스프링 문서에 자세히 설명되어 있습니다 : 9.3.2.1 Context management and caching.

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

+0

아! 그걸 몰랐어. 우리는 오랫동안이 접근법을 따라 왔으며 테스트 실행을위한 긴 기간이 모든 테스트 클래스의 봄 컨텍스트 로딩에 기인 한 것입니다 (실수로). 이제 신중히 확인하겠습니다. 감사. – Ramesh

+0

나는 스프링이 테스트 케이스의 실행 순서에 대한 지식이 없다고 말하고 싶다. 결과적으로 컨텍스트가 나중에 필요하거나 폐기 될 수 있는지 여부를 알 수 없습니다. – philnate

+1

이것이 사실 일 수있는 방법을 모르겠습니다. Eclipse/JUnit은 Run As/JUnit 테스트를 수행 할 때마다 2 분 동안 환경을 테스트합니다. 캐시 된 것이 있으면 이렇게되지 않습니다. – user1944491

22

스프링 3.2.2 @ContextHierarchy 주석을 사용하여 별도의 관련 다중 컨텍스트 구조를 가질 수 있습니다. Tomasz Nurkiewicz's answer에 추가 할 수 있습니다. 이것은 여러 테스트 클래스가 (예를 들어) 메모리 내 데이터베이스 설정 (데이터 소스, EntityManagerFactory, tx 관리자 등)을 공유하고자 할 때 유용합니다. 이것은 개별 유닛 테스트의 주입 수 안에 "테스트 DB-설치-context.xml에이"한번만 만들지 만, 빈 것 사용 상황이 설정을 가짐으로써

@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 { 
... 
} 

예 :

상황에 맞는 매뉴얼에

더 :

+0

다중 모듈 maven이 있는데 서비스 모듈에서 데이터베이스 설치를 피하려고합니다 (이미 데이터 액세스 모듈의 테스트를로드했기 때문에). –

+2

이것은 나를 위해 일했습니다! 감사. @ContextHierarchy 주석이 없으면 spring은 각 테스트마다 내 db를로드합니다. 나는 "클래스"매개 변수를 사용하고 있습니다 : @ContextConfiguration (classes = {JpaConfigTest.class, ... – Brel

+4

컨텍스트 정의를 위해 XML을 사용하는 대신 주석을 통해이 작업을 완전히 수행 할 수 있다면 어떨까요? 그것은 의사와 여기에 그래서하지만 그것은 불가능하다고 생각하게 유도 아무것도 찾을 수 없습니다. –

관련 문제