naver / fixture-monkey

Let Fixture Monkey generate test instances including edge cases automatically
https://naver.github.io/fixture-monkey
Apache License 2.0
575 stars 90 forks source link

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

Open m-fire opened 1 year ago

m-fire commented 1 year ago

Describe the bug

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

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

Your environment

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

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

seongahjo commented 1 year ago

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

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

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

m-fire commented 1 year ago

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

seongahjo commented 1 year ago

https://github.com/kotest/kotest/issues/2323