@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)
위 코드를 적용하는 방법은 두 가지가 있다. (둘 다 정상동작 한다.)
테스트 클래스 내에 선언한다.
@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
}
}
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 활성화
}