Spring 애노테이션 기반 통합 테스트 작성하기
http://static.springframework.org/spring/docs/2.5.x/reference/testing.html#testcontext-tx
스프링이 제공하는 통합 테스트 용 클래스들은 매우 유용합니다. 특히 DAO를 테스트 할 때 자동 롤백은 정말이지 고마움까지 느껴질 정도로 애착이 갑니다. 그러나 한 가지 단점이 있다면, 이름이 너무 길다는 것이 단점입니다.
AbstractTransactionalDataSourceSpringContextTests
거의 40자 입니다. 이것을 외워서 타이핑 하다가는 오타나기 딱 좋습니다. 다행히 Eclipse의 자동완성 기능을 사용하면 AbstractT 까지만 입력하면 해당 클래스를 입력할 수 있습니다.
이 클래스는 내부적으로 DataSource를 필요로 하고, 이 클래스의 상위 클래스인 AbstractTransactionalSpringContextTests 이녀석은 PlatformTransactionManager를 필요로 합니다. 이 두 개를 가지고 테스트 케이스를 트랜잭션 처리해 주는 일을 합니다.
스프링에서 트랜잭션 처리를 선언적으로 하는 방법이 두 가지 있는데, 하나는 XML이고, 하나는 애노테이션을 사용하는 방법입니다. XML은 역시 다 잊어버려서 레퍼런스를 찾아봐야합니다. 애노테이션은 그나마 기억하기가 매우 쉽습니다. @Transactional 이라는 것만 붙여주면 되죠.
이야기가 더 새기전에 마무리 해야겠습니다.
결론만 말씀드리면, Spring 2.5부터는 AbstractTransactionalDataSourceSpringContextTests를 쓰는 대신에 @Transactional과 @TransactionConfiguration을 사용해서 같은 기능을 하는 테스트 클래스를 작성할 수 있습니다.
@ContextConfiguration
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class DaoTest {
@BeforeTransaction
public void beforeTransation() {
System.out.println("before transation");
}
@Before
public void before() {
System.out.println("before");
}
@After
public void after() {
System.out.println("after");
}
@AfterTransaction
public void afterTransaction() {
System.out.println("after transaction");
}
@Test
public void transactionalTest() throws Exception {
System.out.println("This is a transactional test");
}
@Test
@NotTransactional
public void testname() throws Exception {
System.out.println("This is not a transactional test");
}
}
애노테이션의 이름을 보고 어떤 결과가 출력될지 예상해 보세요. 정답은 접어 둡니다.
[#M_ more.. | less.. |before transation
before
This is a transactional test
after
after transaction
before
This is not a transactional test
after
_M#]
이밖에도, @Rollback 애노테이션으로 특정 테스트 케이스를 롤백할지 말지 설정할 수도 있습니다.