2011-03-15 4 views
0

나는 모든 테스트 전후에 트랜잭션을 시작하고 롤백 할 수있는 트랜잭션 junit 러너와 트랜잭션 기능을 사용하고 있습니다.스프링, 트랜잭션 및 유닛 테스트 - 클래스 수준에서 트랜잭션을 설정하는 방법

그러나 무거운 DB 초기화 테스트 클래스가 있고 각 테스트 (메서드) 트랜잭션 범위 내에서 실행되도록, 즉 테스트 시작 부분에 트랜잭션을 시작하고 클래스의 모든 테스트 후에 롤백합니다. 완료되었습니다.

답변

4

단일 트랜잭션 내에서 클래스 내의 모든 테스트 메소드를 사용하면 많은 문제가 발생한다는 것을 알고 계십니까? 기본적으로 다른 테스트 방법으로도 데이터베이스를 수정하므로 더 이상 데이터베이스를 정리하지 않아도됩니다. 테스트 방법의 순서가 지정되지 않았으므로이 테스트 방법의 순서에 의존 할 수 없으므로 (데이터베이스가 정확히 무엇을 보유하는지 결코 알 수 없습니다). 본질적으로 모든 테스트 트랜잭션 지원을 포기하고 있으므로 테스트 케이스 전체를 실행 한 후에 데이터베이스가 깨끗하게 유지되므로 다른 테스트 케이스는 영향을받지 않습니다.

불평의 종말. 나는 봄이 그런 행동을 즉시 지원한다고 생각하지 않는다. (부분적으로 위에 강조된 이유 때문에 부분적으로). 그러나 TransactionalTestExecutionListener을 자세히 살펴보면 스프링 테스트에서 트랜잭션 지원을 담당합니다.

@Override 
public void beforeTestMethod(TestContext testContext) throws Exception { 
    //... 
    startNewTransaction(testContext, txContext); 
} 

과 :

@Override 
public void afterTestMethod(TestContext testContext) throws Exception { 
    //... 
    endTransaction(testContext, txContext); 
    //... 
} 

지금 더 가까이 봐, 당신은 어떻게 봄 참조 문서의 장 9.3.5이 모든 철사하는 자세한 지침을 찾을 것입니다 ... beforeTestClassafterTestClass 구현되지 않은있다. 힌트 : 직접 청취자를 작성하고 TransactionalTestExecutionListener 대신 사용하십시오.

관련 문제