@SpringBootTest
@SpringbootApplication을 찾아 설정으로 사용한다.
테스트 코드는 각각의 테스트가 독립적으로 수행되어야 하고 순서에 의해 결과가 달라지면 안된다. 만약 DB를 포함한 테스트를 진행한다고 했을 때 각 테스트가 종료될 때 DB는 이전의 상태로 돌아와야 한다.
@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
@BeforeEach
void beforeEach() {
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
@AfterEach
void afterEach() {
transactionManager.rollback(status);
}
스프링은 PlatformTransactionManager
를 자동으로 빈으로 등록해 주입해준다.
스프링이 제공하는 @Tranactional은 로직이 성공적으로 수행되면 커밋되도록 동작한다. 그런데 테스트에서 사용되면 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버린다.
@Transactional
@SpringBootTest
class ItemRepositoryTest {
...
}
만약 서비스 계층에 @Transactional 이 있다면? 테스트에 있는 트랜잭션에 참여해 같은 커넥션을 이용하게 된다.
만약 테스트에서도 롤백이 안되게 하고 싶다면
// @Commit
@Rollback(value = false)
@Test
void test(){...}
@Commit 이나 @Rollback(value=false) 를 붙이면 된다.