본문 바로가기

트러블 슈팅

Kotest + 생성자 Bean 주입

상황

@WebMvcTest(TestController::class)
class TestControllerTest @Autowired constructor(
    private val testService: TestService
) : DescribeSpec({
    describe("---") {
        context("---") {
            it("---") {
                ---
            }
        }
    }
})

Kotest DCI 패턴을 적용하여 테스트를 진행하려고 테스트 코드를 작성하는 과정에서 생성자를 통해 빈을 주입 받으니 다음과 같은 에러가 발생했다.

io.kotest.engine.spec.SpecInstantiationException: Could not create instance of class kr.weit.odya.controller.test.TestControllerTest. Specs must have a public zero-arg constructor.

 

원인

Kotest에서 Specs(테스트 스펙)은 public-zero-arg(인자가 없는) 생성자를 가져야 한다. 따라서, Kotest를 사용하면서 생성자를 통해 빈을 주입하려고 할 때, 발생하게 된다.

 

💥 Kotest는 Reflection을 사용하여 테스트 클래스의 인스턴스를 동적으로 생성하는데, Reflection은 public zero-arg 생성자를 필요로 하기 때문에 발생한다.

 

해결 방법

testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.2")

해당 의존성은 Kotest와 Spring 프레임워크를 통합하여 사용할 수 있는 확장 기능을 한다.

따라서, 해당 의존성을 설정해야 @Autowired와 같은 Spring 기능 등을 사용해서 테스트를 진행할 수 있다.