woowacourse / service-apply

우아한테크코스 지원부터 최종 합격까지 모든 과정을 관리한다.
529 stars 100 forks source link

JUnit 5 -> Kotest로 마이그레이션한다. #529

Closed woowahan-pjs closed 2 years ago

woowahan-pjs commented 2 years ago

관련 이슈: #63

woowahan-pjs commented 2 years ago

https://github.com/woowacourse/service-apply/issues/533#issuecomment-1175040962 에 이어 작성합니다.

woowahan-pjs commented 2 years ago

Kotest Spring extension을 사용한 예

@Transactional
@SpringBootTest
class LanguageServiceTest(
    private val languageService: LanguageService
) : StringSpec({
    extensions(SpringExtension)

    "언어를 추가한다." {
        val language = languageService.create(code = "ko", name = "한국어")
        assertSoftly(language) {
            id shouldNotBe 0
            code shouldBe "ko"
            name shouldBe "한국어"
        }
    }
})

Mock 객체 재사용을 방지하는 방법

override fun extensions() = listOf(SpringExtension)
override fun isolationMode(): IsolationMode = IsolationMode.InstancePerLeaf

Spring REST Docs

val restdocs = ManualRestDocumentation()

beforeEach {
    restdocs.beforeTest(javaClass, "name")
}

afterEach {
    restdocs.afterTest()
}
woowahan-pjs commented 2 years ago
  1. Kotest 5는 코틀린 1.6 이상에서 작동한다. Kotest 내에서 코틀린 1.6의 DurationUnit을 사용한다.
java.lang.NoClassDefFoundError: kotlin/time/DurationUnit
    at io.kotest.engine.spec.interceptor.SpecFinishedInterceptor.intercept-0E7RQCE(SpecFinishedInterceptor.kt:22)
    at io.kotest.engine.spec.interceptor.SpecFinishedInterceptor$intercept$1.invokeSuspend(SpecFinishedInterceptor.kt)
    ...
  1. Kotest 5는 내부적으로 코틀린 코루틴 1.6 이상을 사용한다. 스프링 부트는 2.7.0 버전부터 코틀린 코루틴 버전 1.6.1을 관리한다. 따라서 스프링 부트 2.6.x 버전까지는 kotlin-coroutines.version을 1.6.0으로 지정해야 한다.
extra["kotlin-coroutines.version"] = "1.6.0"
java.lang.ClassNotFoundException: kotlinx.coroutines.test.TestDispatcher
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    ...
  1. AnnotationSpec에서 @Nested를 사용할 수 없다.
    • Kotest 5에서 @Nested을 지원한다고 하였지만 https://github.com/kotest/kotest/commit/69eea2d50067c6fa309fbad568d770c5e861a439에서 주석 처리되었다.
    • Added support for @Nested in AnnotationSpec

    • https://github.com/kotest/kotest/issues/2367
    • https://github.com/kotest/kotest/issues/3103
java.lang.IllegalArgumentException: object is not an instance of declaring class
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    ...