2014-07-18 1 views
0

나는 스프링 통합 테스트를 실행 중이므로 해당 테스트에 @RunWith(SpringJUnit4ClassRunner.class)을 사용하고 있습니다.통합 테스트를위한 SpringJUnit4ClassRunner의 기본 롤백 동작에 대한 질의

일부 테스트에서는 @Transactional이라는 비즈니스 클래스/메소드 (예 : src/main/java)를 호출하고 이러한 클래스/메소드는 데이터베이스의 데이터를 조작합니다.

@Transactional으로 주석 처리 된 테스트 클래스/메소드 (즉, src/test/javaSpringJUnit4ClassRunner)는 달리 지정하지 않으면 자동으로 롤백을 수행한다는 것을 알고 있습니다.

통합 테스트를 실행할 때 해당 동작 (자동 롤백)이 비즈니스 클래스/메소드 (예 : src/main/java에 위치)에서 조작 된 데이터에 대해서도 기대되는지 알고 싶습니다.

당신은 행운에있어

답변

2

는 ... 말 그대로 단지 다음과 같은 해명과 TransactionalTestExecutionListener의 자바 독을 업데이트 :

시험 관리 트랜잭션

시험 관리 트랜잭션 관리 교환을 할 수 있습니다를 이 리스너를 통해 선언적으로 또는 프로그래밍 방식으로 TestTransaction을 통해 전달됩니다. 이러한 트랜잭션은 Spring 관리 트랜잭션 (테스트를 위해로드 된 ApplicationContext 내의 Spring에 의해 직접 관리되는 트랜잭션) 또는 애플리케이션 관리 트랜잭션 (테스트를 통해 호출되는 애플리케이션 코드 내에서 프로그래밍 방식으로 관리되는 트랜잭션)과 혼동되어서는 안됩니다. 스프링 관리 및 애플리케이션 관리 트랜잭션은 일반적으로 테스트 관리 트랜잭션에 참여합니다. 그러나 Spring 관리 또는 응용 프로그램 관리 트랜잭션이 REQUIRED 또는 SUPPORTS 이외의 전파 유형으로 구성된 경우주의해야합니다. @Transactional과 시험 방법을 주석

활성화 및 비활성화 거래

테스트는 기본적으로 자동으로 테스트 완료 후 롤백하는 트랜잭션 내에서 실행됩니다. 테스트 클래스에 @Transactional 주석이 달린 경우 해당 클래스 계층 구조 내의 각 테스트 메소드가 트랜잭션 내에서 실행됩니다. @Transactional로 주석 처리되지 않은 테스트 메소드 (클래스 또는 메소드 레벨에서)는 트랜잭션 내에서 실행되지 않습니다. 또한 @Transactional 주석이 있지만 전파 유형이 NOT_SUPPORTED로 설정된 테스트는 트랜잭션 내에서 실행되지 않습니다.

선언적 롤백과 행동을 기본적으로

커밋, 테스트 거래는 자동으로 테스트 완료 후 롤백됩니다; 그러나 트랜잭션 커밋 및 롤백 동작은 클래스 수준 @TransactionConfiguration 및 메서드 수준 @Rollback 주석을 통해 선언적으로 구성 할 수 있습니다.

그러나 TestTransaction은 Spring Framework 4.1의 새로운 기능이지만 어제 발표 된 4.1 RC1에서 시험해 볼 수 있습니다.) 질문의 맥락에서

, 당신이 src/main/java에서 언급하고있는 코드는 자바 독에 언급 된 Spring 관리 또는 응용 프로그램 관리 트랜잭션 관련이있을 것이다. 즉, 새로운 거래가 필요한 응용 프로그램 코드가 없거나 현재 거래가 일시 중지 된 경우 (즉,, 테스트 관리 트랜잭션), 애플리케이션 코드에 의한 변경 사항도 테스트 관리 트랜잭션과 함께 롤백됩니다.

감사합니다,

샘 (스프링 TestContext 프레임 워크의 저자)