Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JakartaValidationPlugin이 설정 된 FixtureMonkey 는, 필드에 Jakarta @Pattern 이 선언된 Kotlin Data Class 모델 테스트 시, 무한루프에 빠져 테스트 수행을 막습니다. #772

Open
m-fire opened this issue Oct 1, 2023 · 3 comments
Labels
bug Something isn't working

Comments

@m-fire
Copy link

m-fire commented Oct 1, 2023

Describe the bug

아래 build.gradle.kts 와 FixtureMonkeyTest.kt 테스트를 수행하면,
테스트 시작과 동시에 중지된 것 처럼 딜레이가 생기는데, 무한루프에 빠진 듯 정지된 상태로 테스트 진행이 안됩니다.
또한 계속 기다리면 Heap 메모리가 가득 차서 VM 이 강제종료됩니다.

그러나 아래 MemberCreateRequest 모델 의 @field:Pattern(...) 을 주석처리하면 테스트가 정상동작 합니다.
아래는 재현이 가능한 테스트 코드입니다.

Your environment

  • Java Temurin 17.0.7 / Kotlin 1.8.22

build.gradle.kts

plugins {
    id("org.springframework.boot") version "3.1.4"
    id("io.spring.dependency-management") version "1.1.3"
    id("org.jlleitschuh.gradle.ktlint") version "11.5.0"
    id("io.gitlab.arturbosch.detekt") version "1.23.1"

    val kotlinVersion = "1.8.22"
    kotlin("jvm") version kotlinVersion
    kotlin("kapt") version kotlinVersion
    kotlin("plugin.spring") version kotlinVersion
    kotlin("plugin.jpa") version kotlinVersion
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    runtimeOnly("org.mariadb.jdbc:mariadb-java-client")

    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(module = "junit-vintage-engine")
        exclude(module = "mockito-core")
    }
    testImplementation("com.ninja-squad:springmockk:4.0.2")
    testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter-kotlin:0.6.8")

    developmentOnly("org.springframework.boot:spring-boot-devtools")
    implementation("io.github.microutils:kotlin-logging-jvm:3.0.5")
    implementation("com.github.f4b6a3:ulid-creator:5.2.0") // 시계열 UUID 생성모듈
}

Steps to reproduce

FixtureMonkeyTest.kt

import com.fasterxml.jackson.annotation.JsonProperty
import com.navercorp.fixturemonkey.FixtureMonkey
import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin
import com.navercorp.fixturemonkey.kotlin.KotlinPlugin
import com.navercorp.fixturemonkey.kotlin.giveMeOne
import jakarta.validation.constraints.Email
import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.Pattern
import org.junit.jupiter.api.Test

class FixtureMonkeyTest {
    val sut = FixtureMonkey.builder()
        .plugin(KotlinPlugin())
        .plugin(JakartaValidationPlugin())
        .build()

    @Test
    fun `SUT 는 필드에 선언된 @Pattern 제약 처리에 문제가 없어야 합니다`() {
        val reqest: MemberCreateRequest = sut.giveMeOne()
    }

    data class MemberCreateRequest(
        @param:JsonProperty("email")
        @field:NotBlank
        @field:Email
        val email: String,

        @param:JsonProperty("password")
        @field:NotBlank
        @field:Pattern(
            regexp = "^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]{8,20}$",
            message = "영문, 숫자, 특수문자를 포함한 8~20자리로 입력해주세요",
        )
        val password: String,
    )
}

Expected behaviour

  • 테스트 수행에 문제가 없습니다.

Actual behaviour

순환 참조라도 걸린 듯, 테스트 진행이 안됩니다.

@m-fire m-fire added the bug Something isn't working label Oct 1, 2023
@m-fire m-fire changed the title Jakarta @Pattern 이 필드에 선언된 Kotlin Data Class 모델 테스트 시, JakartaValidationPlugin 설정 된 FixtureMonkey 는 무한루프로 테스트 수행을 막습니다. JakartaValidationPlugin이 설정 된 FixtureMonkey 는 Jakarta @Pattern 이 필드에 선언된 Kotlin Data Class 모델 테스트 시, 무한루프로 테스트 수행을 막습니다. Oct 1, 2023
@m-fire m-fire changed the title JakartaValidationPlugin이 설정 된 FixtureMonkey 는 Jakarta @Pattern 이 필드에 선언된 Kotlin Data Class 모델 테스트 시, 무한루프로 테스트 수행을 막습니다. JakartaValidationPlugin이 설정 된 FixtureMonkey 는, Jakarta @Pattern 이 필드에 선언된 Kotlin Data Class 모델 테스트 시, 무한루프로 테스트 수행을 막습니다. Oct 1, 2023
@m-fire m-fire changed the title JakartaValidationPlugin이 설정 된 FixtureMonkey 는, Jakarta @Pattern 이 필드에 선언된 Kotlin Data Class 모델 테스트 시, 무한루프로 테스트 수행을 막습니다. JakartaValidationPlugin이 설정 된 FixtureMonkey 는, 필드에 Jakarta @Pattern 이 선언된 Kotlin Data Class 모델 테스트 시, 무한루프에 빠져 테스트 수행을 막습니다. Oct 1, 2023
@seongahjo
Copy link
Contributor

@m-fire
안녕하세요. 이슈 확인했습니다. 감사합니다.
저희가 @Pattern을 지원하기 위해 사용하는 라이브러리를 확인해봐야해서 해결하는 데 시간이 걸릴 것 같습니다.
해결하면 멘션 드리겠습니다.

임시로 register 옵션을 사용해서 password 프로퍼티를 고정하셔서 사용하시면 감사하겠습니다.

혹시 다른 질문이나 이슈가 있으시면 편하게 말씀해주세요.
감사합니다.

@m-fire
Copy link
Author

m-fire commented Oct 9, 2023

감사합니다. 응원합니다!

@seongahjo
Copy link
Contributor

kotest/kotest#2323

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants