[Kotlin] Kotest 시 EntityManager가 정상동작 하지 않는 현상 기록

정지수 JisooJung·2022년 8월 8일
0
post-custom-banner

문제

@DataJpaTest
class ItemRepositoryTest @Autowired constructor(
	private val itemRepository: ItemRepository,
    private val entityManager: EntityManager
) : DescribeSpec({
	
    describe("#save") {
    	beforeTest {
        	item = getItem()
            entityManager.persist(item)
            entityManager.flush()
            entityManager.clear()
        }
        
        it("정상동작 한다") {
        	...
        }
    }
    
}) {
	companion object {
    	lateinit var item
    }
}

위 코드 실행 시 아래와 같은 에러가 발생하였다.

javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call

해결

Kotest에서 Spring 프레임워크를 사용하는 코드를 적용하려면 Spring Extension이 활성화 되어 있어야 한다. 즉, kotest에서 @Transactional을 적용하려면 아래 구문이 테스트 코드 내에 선언되어있어야 한다.

override fun extensions() = listOf(SpringExtension)

위 코드를 적용하는 방법은 두 가지가 있다. (둘 다 정상동작 한다.)

방법 1.

테스트 클래스 내에 선언한다.

@DataJpaTest
class ItemRepositoryTest @Autowired constructor(
	private val itemRepository: ItemRepository,
    private val entityManager: EntityManager
) : DescribeSpec() {

	override fun extensions() = listOf(SpringExtension) // extension 활성화

	init{
      	describe("#save") {
          	beforeTest {
              	item = getItem()
              	entityManager.persist(item)
              	entityManager.flush()
              	entityManager.clear()
          	}

          	it("정상동작 한다") {
            	  ...
        	}
    	}
  	}
    
	companion object {
    	lateinit var item
    }
}

방법 2.

test 패키지 내에 아래 클래스를 생성한다.

package com.example.demo.testconfig

import io.kotest.core.config.AbstractProjectConfig
import io.kotest.extensions.spring.SpringExtension

class ProjectConfig : AbstractProjectConfig() {
    override fun extensions() = listOf(SpringExtension) // extension 활성화
}


참조
https://kotest.io/docs/extensions/spring.html

profile
Study&Work&Log
post-custom-banner

0개의 댓글