2012-01-13 2 views
5

Spring 어플리케이션의 JUnit 테스트에서 설정 메소드에 많은 데이터를 삽입하고 테스트 할 때 사용하고 싶습니다.@Rollback (false)가 SpringJUnit4ClassRunner를 사용하기 전에 작동하지 않습니다.

public class TestClass 
{ 
    @Autowired 
    MyService service; 

    @Before 
    public void setup() 
    { 
     if(service.getById(1) == null) 
     { 
     Thing thing = new Thing(); 
     thing.setId(1); 
     service.create(new Thing(1)) 
     } 
    } 
} 

그러나, 어떤이 @Before 방법으로 이루어집니다 여기에 내가 뭘하려는거야의 단순화 된 버전의 내가 @Rollback(false)

와 방법에 주석을 경우에도, 각 테스트 후 롤백 할 것으로 보인다 나는 또한 @BeforeClass을 사용해 보았습니다. 그러나 메서드가 정적이어야하고 어떤 @Autowired setter 메서드도 호출되기 전에 실행되므로 @BeforeClass이 실행될 때 호출해야하는 서비스에 액세스 할 수 없습니다.

@PostConstruct을 사용해 보았지만 트랜잭션을 사용할 수있는 문제가 있으며 트랜잭션이 시작될 때만 최대 절전 모드 세션을 사용할 수 있습니다. 이상하게 세션이 사용 가능해 보였지만 동일한 세션 내에서 두 개의 객체가 같지 않았기 때문에 Hibernate 1 차 수준 캐시가 실패한 것처럼 보였거나 각각의 작업이 개별 세션에서 발생했습니다. @BeforeTransaction은 동일한 동작을 나타내는 것으로 보입니다.

+0

클래스 나 메소드 레벨에서 어디에서'@ Rollback' 어노테이션을 작성 했습니까? – Ralph

+0

@Ralph 나는'setup()'메소드'@Rollback (false)'를 시도한 다음 테스트 메소드에'@ Rollback'을 사용하여 주석을 달았습니다. –

+0

이것을 달성 할 수있는 방법을 찾았습니까? – Arjan

답변

2

스프링 TransactionalTestExecutionListener은 Junit 테스트를위한 트랜잭션 관리를 담당합니다. 각 테스트에 대한 트랜잭션을 시작하고 종료하는 데 두 가지 방법 (beforeTestMethodafterTestMethod)을 사용합니다. 다음과 같이 작동하는 것 같다 @Before 주석에 관해서는

은, 그것은 @Before 주석을 설정 방법에에 시험 방법에 지정된 @Rollback 속성을 적용

나는 과정을 설명하기 위해이 예제를 가지고 , 나는 두 가지 테스트 방법 중 하나를 가지고있다. (롤백으로 다른 것을 롤백한다.)

 @RunWith(SpringJUnit4ClassRunner.class) 
     @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class}) 
     @Transactional 
     public class MyTest 
     { 

     @Before 
     public void setUp() 
     { 
      //When executing this method setUp 
      //The transaction will be rolled back after rollBackTrue Test 
      //The transaction will not be rolled back after rollBackFalse Test 
     } 


     @Test 
     @Rollback(true) 
     public void rollBackTrue() 
     { 
      Assert.assertTrue(true); 
     } 

     @Test 
     @Rollback(false) 
     public void rollBackFalse() 
     { 
      Assert.assertTrue(true); 
     } 
    } 
+0

안녕하세요, Prasana. 귀하의 답변을 주셔서 감사합니다,하지만 그건 옳지 않아. service.create()가 트랜잭션의 일부가 아닌 경우 모든 테스트 후에 기본적으로 롤백되는 이유는 무엇입니까? 문제는 트랜잭션 외부에 있기를 원하기 때문에 롤백되지 않지만 어떻게 찾을 수 없는지입니다. –

+0

죄송합니다. My Test는 저를 버렸고 메서드 설명서를 읽어야했습니다. 예를 들어 대답을 변경했습니다. –