TDD/JUnit5

@Test - @Transactional 적용

wooweee 2023. 9. 25. 16:50
728x90

1.  test - data rollback

  • spring db 1 에서 학습한 transactionManger과 status를 이용하여 status가 true, false 상관 없이 무조건 rollback하도록 @BeforeEach @AfterEach 사용

  • @BeforeEach 수행 부터 @AfterEach 오기전까지 동일 connection을 사용하는 transaction 수행됨
package hello.itemservice.domain;

@SpringBootTest
class ItemRepositoryTest {
    
    // DataSource와 txManger는 springboot에서 자동으로 생성해놓았다.
    @Autowired
    ItemRepository itemRepository;
    
    //tx 관련 code
    @Autowired
    PlatformTransactionManager transactionManager; // spring boot에서 생성해줌 
    TransactionStatus status; // status를 통해서 commit, rollback 수행

    @BeforeEach
    void beforeEach(){
        // tx 시작
        status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    }

    @AfterEach
    void afterEach() {
        //MemoryItemRepository 의 경우 제한적으로 사용
        if (itemRepository instanceof MemoryItemRepository) {
            ((MemoryItemRepository) itemRepository).clearStore();
        }
        // tx rollback
        transactionManager.rollback(status);
    }

    ...
    @Test
}

 

2. test - @Transactional

  • test에서 사용시, 조금 특별하게 사용

  • test 내부에서 @Transactional이 존재시, spring은 transaction 내부에 test를 실행하고, test 종료시 로직의 성공적인 수행여부와 관계 없이 transaction을 항상 rollback 시킴

  • test에 사용되는 @Transactional도 Class, method 모두 원하는 부분에 적용 가능

  •  참고 - @Service test 시, @Service 내부에 @Transactional도 존재할 텐데 어떻게 충돌을 막을까?
    • test case의 @Transactional 과 @Service, @Repository에 있는 @Transactional 도 Test에서 시작한 트랜잭션에 참여
      = Test가 종료될 때까지 Test의 connection을 사용한다는 의미
  • test의 @Transactional 강제 commit 하기
    • @Commit
    • @Rollback(value = false)

 

package hello.itemservice.domain;

// @Transactional, @Commit,@Rollback(value = false) 모두 class, method 영역에 설정 가능
@Transactional
@Commit == @Rollback(value = false)
@SpringBootTest
class ItemRepositoryTest {
    
    // DataSource와 txManger는 springboot에서 자동으로 생성해놓았다.
    @Autowired
    ItemRepository itemRepository;
    
    //tx 관련 code
   /* 
   @Autowired
    PlatformTransactionManager transactionManager;
    TransactionStatus status;

    @BeforeEach
    void beforeEach(){
        // tx 시작
        status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    }
    */

    @AfterEach
    void afterEach() {
        // MemoryItemRepository 의 경우 제한적으로 사용
        if (itemRepository instanceof MemoryItemRepository) {
            ((MemoryItemRepository) itemRepository).clearStore();
        }
        // tx rollback
        // transactionManager.rollback(status);
    }

 // @Rollback(value = false) == @Commit
    @Test

 

참고 발행글 : 2023.09.25 - [spring/spring db2] - 3. 데이터 접근 기술 - 테스트