jpa/Spring Data JPA
@Transactional 롤백/커밋 테스트
잘할수있을거야
2023. 7. 19. 17:46
application프로퍼티에서 org.springframework 패키지를 debug로 잡으면 로그가 많이 남기때문에
TransactionManager에 대해서만 debug로 잡고 테스트
@Rollback(true)인 경우
package study.hibernate.springdatajpa.transaction;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.transaction.AfterTransaction;
import org.springframework.test.context.transaction.BeforeTransaction;
import org.springframework.transaction.annotation.Transactional;
import lombok.extern.slf4j.Slf4j;
// @Rollback(true) 어노테이션이 붙은 것과 동일
@SpringBootTest
@Transactional
@ActiveProfiles("test")
@TestInstance(Lifecycle.PER_CLASS)
@Slf4j
public class TransactionTest {
@BeforeAll
void beforeAll() {
log.debug("=================================> @BeforeAll");
}
@BeforeTransaction
void beforeTransaction() {
log.debug("=================================> @BeforeTransaction");
}
@BeforeEach
void beforeEach() {
log.debug("=================================> @BeforeEach");
}
@AfterTransaction
void afterTransaction() {
log.debug("=================================> @AfterTransaction");
}
@AfterEach
void afterEach() {
log.debug("=================================> @AfterEach");
}
@AfterAll
void AfterAll() {
log.debug("=================================> @AfterAll");
}
@Test
void test1() {
log.debug("=================================> test1");
}
@Test
void test2() {
log.debug("=================================> test2");
}
}
각 테스트의 @BeforeEach 수행전 트랜잭션 시작 @AfterEach 종료시 트랜잭션 롤백
@Rollback(false)인 경우
@SpringBootTest
@Transactional
@ActiveProfiles("test")
@Rollback(false)
@TestInstance(Lifecycle.PER_CLASS)
@Slf4j
public class TransactionTest {
각 테스트의 @BeforeEach 수행전 트랜잭션 시작 @AfterEach 종료시 트랜잭션 커밋
@BeforeEach, @AfterEach 또한 각 테스트의 트랜잭션에 포함되기 때문에 각 테스트의 전후에 Transactional하지 않은 작업이 필요한 경우 @BeforeTransaction, @AfterTransaction이 붙은 메서드를 정의하여 Transaction과 관련되지 않은 작업을 진행시킨다.
@BeforeAll, @AfterAll또한 Transactional하게 처리되지 않음