경험/이슈

Kotest BehaviorSpec에서 transaction rollback 안 됨

호야_ 2023. 6. 22. 16:00
728x90

결론

import io.kotest.extensions.spring.SpringTestExtension
import io.kotest.extensions.spring.SpringTestLifecycleMode
import org.springframework.transaction.annotation.Transactional
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
class SomeControllerTest(
    private val mockMvc: MockMvc,
    private val objectMapper: ObjectMapper,
) : BehaviorSpec({
    extensions(SpringTestExtension(SpringTestLifecycleMode.Root))
    
    // ...
    
)}

@Transactional과 extensions(SpringTestExtension(SpringTestLifecycleMode.Root))를 Root로 설정해 주면 된다.

 

오류상황

@SpringBootTest
@AutoConfigureMockMvc
class SomeControllerTest(
    private val mockMvc: MockMvc,
    private val objectMapper: ObjectMapper,
) : BehaviorSpec({

    Given("") {
    	When("") {
            Then("") {

이런 구조의 Kotest를 쓰고 있었는데 통합테스트를 하고 있어서 PATCH나 POST로 DB를 업데이트하는 부분이 있었다. 그런데 이제 트랜잭션 롤백이 안 돼서 DB에 업데이트가 적용되는 이슈가 있었다.

  • 간단하게 생각해 낸 해결 방안이 @Transactional을 붙이면 되겠다고 생각했다. 그래도 롤백이 안 됐다..
  • 찾아보니 extensions(SpringTestExtension(SpringTestLifecycleMode.Root))를 Root나 Test를 하면 된다고 해서 했는데 이래도 안 됐다..
  • 그래서 이제 두 개를 같이 써봤는데 롤백이 드디어 됐다..!
    • 사실 여기서 SpringTestLifecycleMode.Test랑 @Transactional 이랑 같이 쓰면 또 롤백이 안 되긴 한다..

 

 

 

잘 안 되는 부분이나 오류가 나는 부분이 있으면 댓글로 공유 부탁드려요! 언제나 잘못된 설명이나 부족한 부분에 대한 피드백은 환영입니다🤍

728x90