프로그래밍/Kotlin

kotest 생성자 bean 주입 오류 - Specs must have a public zero-arg constructor

seungdols 2023. 7. 18. 20:54

kotest에서 빈을 생성자 주입으로 쓰려고 하면, Specs must have a public zero-arg constructor 오류가 발생 할 수 있다. 

이 때에는 kotest-extension-spring 모듈이 필요로 하다. 

kotest extension spring 라이브러리가 두개가 검색 되곤 하는데, 헷갈리면 안된다. 

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

 

Spring | Kotest

Kotest offers a Spring extension that allows you to test code that uses the Spring framework for dependency injection.

kotest.io

실제 docs를 보면, 1.1.3 버전이 최신이다. 

https://mvnrepository.com/artifact/io.kotest/kotest-extensions-spring/4.4.3

위의 라이브러리는 지원이 중단 된 것인지, 이미 오래 전 소스의 라이브러리이고, 실제 kotest repository에는 해당 소스가 없다. 

https://github.com/kotest/kotest-extensions-spring

 

GitHub - kotest/kotest-extensions-spring: Kotest extension for Spring framework

Kotest extension for Spring framework. Contribute to kotest/kotest-extensions-spring development by creating an account on GitHub.

github.com

위의 레포지토리가 진짜다. 

아, 지난번에도 헷갈려서 test code 작성하다가 삽질 했는데, 오늘도 삽질 엄청나게 했다.

그리고, test 디렉토리 아래 설정을 넣어주는 게 중요하다. 

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

class ProjectConfig : AbstractProjectConfig() {
    override fun extensions() = listOf(SpringExtension)
    override val parallelism = 3
}
@SpringBootTest(
    classes = [GrpcServerApiApplication::class]
)
@ActiveProfiles("test")
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
class GrpcHelloServiceTest(
    val grpcHelloService: GrpcHelloService
) : AnnotationSpec() {

...

}

위처럼 설정 하면, 실제로 정상적으로 테스트가 성공 하게 되는데, 라이브러리를 잘 못 넣으면 온갖 행동을 해도 안돌아간다.

까먹지 말자.

반응형