요금제

빠른 시작

관련 소스 파일

이 페이지의 내용은 다음 소스 파일을 기반으로 생성되었습니다:

Fixture Monkey는 Java와 Kotlin을 위한 테스트 픽스처 생성 라이브러리로, 복잡한 테스트 객체를 간편하게 생성할 수 있도록 설계되었습니다. 경로 기반 표현식을 통해 중첩된 필드에 자유롭게 접근하고 구성할 수 있는 것이 가장 두드러진 특징입니다 (README.md:11-18).

이 라이브러리는 테스트 작성을 단순화하는 데 중점을 두고 있으며, "Write once, Test anywhere"라는 철학을 따릅니다. JVM 테스트를 더 간결하고 안전하게 만드는 것을 목표로 합니다 (README.md:1-28).

요구사항

필수 환경

Fixture Monkey를 사용하기 위해서는 다음 환경이 필요합니다:

구성 요소버전 요구사항비고
JDK1.8 이상또는 Kotlin 1.8 이상
JUnit 5 Platform필수테스트 프레임워크
jqwik1.7.3속성 기반 테스트 라이브러리

상세 요구사항은 docs/docs/get-started/requirements.md:1-29에서 확인할 수 있으며, 핵심 요구사항 요약은 README.md:191-197에 명시되어 있습니다.

:::tip Fixture Monkey는 테스트 환경을 위해 설계되었습니다. 프로덕션 환경에서의 사용은 권장되지 않습니다 (docs/docs/get-started/requirements.md:7-9). :::

Kotlin 환경 추가 요구사항

Kotlin을 사용하는 경우 다음이 추가로 필요합니다:

  • Kotlin 1.8 이상
  • kotest-property 5.9.1 (Kotlin 지원용)

의존성 추가

의존성 구성

Fixture Monkey는 사용 목적에 따라 다양한 의존성 모듈을 제공합니다:

의존성설명
fixture-monkey핵심 라이브러리
fixture-monkey-starterJava용 스타터 의존성
fixture-monkey-kotlinKotlin 지원
fixture-monkey-starter-kotlinKotlin용 스타터 의존성

fixture-monkey-starter는 fixture-monkey-jakarta-validation과 같은 사전 구성된 의존성이 포함된 스타터 의존성입니다. Kotlin 환경에서는 fixture-monkey-starter-kotlin을 사용할 수 있습니다 (docs/docs/get-started/requirements.md:18-28).

Gradle 설정

Java 프로젝트의 경우 build.gradle 또는 build.gradle.kts에 다음을 추가합니다:

groovy
1testRuntimeOnly("org.junit.platform:junit-platform-launcher:{version}")
2testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.1.18")

Gradle 9부터는 junit-platform-launcher가 필수 의존성이 되므로 런타임 의존성으로 추가해야 합니다 (docs/docs/get-started/requirements.md:30-40).

Kotlin 프로젝트의 경우:

groovy
1// Kotlin
2testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter-kotlin:1.1.18")

상세 설정 예시는 README.md:31-61에서 확인할 수 있습니다.

Maven 설정

Java 프로젝트의 경우 pom.xml에 다음을 추가합니다:

xml
1<dependency>
2    <groupId>com.navercorp.fixturemonkey</groupId>
3    <artifactId>fixture-monkey-starter</artifactId>
4    <version>1.1.18</version>
5    <scope>test</scope>
6</dependency>

Kotlin 프로젝트의 경우:

xml
1<dependency>
2    <groupId>com.navercorp.fixturemonkey</groupId>
3    <artifactId>fixture-monkey-starter-kotlin</artifactId>
4    <version>1.1.18</version>
5    <scope>test</scope>
6</dependency>

Maven 설정 예시는 docs/docs/get-started/requirements.md:42-50에 상세히 설명되어 있습니다.

첫 번째 테스트 객체 생성

기본 객체 생성

Fixture Monkey를 사용한 테스트 객체 생성은 매우 간단합니다. 가장 기본적인 방법은 다음과 같습니다:

java
1// Java
2FixtureMonkey fixtureMonkey = FixtureMonkey.create();
3Product product = fixtureMonkey.giveMeOne(Product.class);
kotlin
1// Kotlin
2val fixtureMonkey = FixtureMonkey.create()
3val product = fixtureMonkey.giveMeOne<Product>()

이 코드를 실행하면 Fixture Monkey가 무작위 값으로 채워진 Product 인스턴스를 생성합니다 (README.md:63-74).

생성된 객체 예시

생성된 객체는 실행할 때마다 다른 값을 가지며, 예시는 다음과 같습니다:

java
1Product(
2    id=42,
3    productName="product-value-1",
4    price=1000,
5    options=["option1", "option2"],
6    createdAt=2024-03-21T10:15:30Z,
7    productType=ELECTRONICS,
8    merchantInfo={1="merchant1", 2="merchant2"}
9)

객체 생성 과정에 대한 상세 설명은 docs/docs/get-started/creating-objects.md:12-43에서 확인할 수 있습니다.

Builder 패턴을 이용한 구성

더 세밀한 제어가 필요한 경우 Builder 패턴을 사용할 수 있습니다:

java
1@Test
2void sampleOrder() {
3    FixtureMonkey sut = FixtureMonkey.builder()
4            .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
5            .build();
6
7    Order actual = sut.giveMeBuilder(Order.class)
8            .set(javaGetter(Order::getOrderNo), "1")
9            .set(javaGetter(Order::getProductName), "Line Sally")
10            .minSize(javaGetter(Order::getItems), 1)
11            .sample();
12
13    then(actual.getOrderNo()).isEqualTo("1");
14    then(actual.getProductName()).isEqualTo("Line Sally");
15    then(actual.getItems()).hasSizeGreaterThanOrEqualTo(1);
16}

Java와 Kotlin 실제 사용 예제는 README.md:75-118에 자세히 나와 있습니다.

Introspector 선택 가이드

Introspector 이해하기

FixtureMonkey 인스턴스를 생성할 때 가장 중요한 부분은 적절한 Introspector를 선택하는 것입니다. Introspector는 Fixture Monkey가 객체를 생성하는 방법을 정의합니다 (docs/docs/get-started/creating-objects.md:45-71).

클래스 구조에 따른 Introspector 선택

클래스 구조권장 Introspector
Lombok @Value / @AllArgsConstructorConstructorPropertiesArbitraryIntrospector
기본 생성자 + setterBeanArbitraryIntrospector (기본값)
Jackson 어노테이션JacksonObjectArbitraryIntrospector (Jackson Plugin 필요)
Kotlin data classPrimaryConstructorArbitraryIntrospector (Kotlin Plugin 필요)

Lombok 사용 시 주의사항

Lombok을 Fixture Monkey와 함께 사용할 때는 lombok.config 파일에 다음 설정을 추가해야 합니다:

lombok.anyConstructor.addConstructorProperties=true

이 설정은 ConstructorPropertiesArbitraryIntrospector가 Lombok과 함께 작동하는 데 필요합니다 (docs/docs/get-started/creating-objects.md:67-70).

Kotlin 환경 설정

Kotlin을 사용하는 경우 Kotlin Plugin을 추가해야 합니다:

kotlin
1val sut = FixtureMonkey.builder()
2        .plugin(KotlinPlugin())
3        .build()

Kotlin 예제는 README.md:96-115에서 확인할 수 있습니다.

실행 검증

테스트 실행 확인

의존성을 올바르게 추가했는지 확인하려면 간단한 테스트를 작성합니다:

java
1@Test
2void test() {
3    // given
4    FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
5        .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
6        .build();
7
8    // when
9    Product actual = fixtureMonkey.giveMeOne(Product.class);
10
11    // then
12    then(actual).isNotNull();
13}

이 테스트가 성공하면 Fixture Monkey가 올바르게 설정된 것입니다 (docs/docs/get-started/creating-objects.md:14-28).

빌드 구성 확인

프로젝트 빌드 파일에서 다음을 확인합니다:

일반적인 문제와 해결 방법

문제 1: 객체 생성 실패

증상: giveMeOne() 호출 시 예외 발생

원인: 잘못된 Introspector 선택

해결 방법: 클래스 구조에 맞는 Introspector를 선택합니다. Lombok @Value 클래스를 사용하는 경우 ConstructorPropertiesArbitraryIntrospector.INSTANCE를 사용하고, lombok.configlombok.anyConstructor.addConstructorProperties=true를 추가합니다 (docs/docs/get-started/creating-objects.md:54-59).

문제 2: Kotlin 데이터 클래스 생성 실패

증상: Kotlin data class 객체 생성 시 오류 발생

원인: Kotlin Plugin 미설정

해결 방법: FixtureMonkey.builder().plugin(KotlinPlugin()).build()를 사용하여 Kotlin Plugin을 활성화합니다 (README.md:101-103).

문제 3: JUnit Platform 인식 실패

증상: 테스트 실행 시 jqwik 엔진을 찾지 못함

원인: junit-platform-launcher 의존성 누락

해결 방법: Gradle 9 이상을 사용하는 경우 testRuntimeOnly("org.junit.platform:junit-platform-launcher:{version}")를 추가합니다 (docs/docs/get-started/requirements.md:31-35).

문제 4: 순환 참조가 있는 객체 생성

증상: 순환 참조가 있는 복잡한 객체 구조에서 스택 오버플로우 또는 무한 루프

원인: 기본 설정으로는 순환 참조 처리가 제한적

해결 방법: Fixture Monkey는 순환 참조가 있는 객체도 처리할 수 있도록 설계되었습니다. 기본 설정으로 생성을 시도하고, 문제가 지속되면 깊이 제한 등의 추가 설정을 검토합니다 (README.md:157-161).

다음 단계

객체 커스터마이징

기본 객체 생성을 마스터했다면, 이제 테스트 시나리오에 맞게 객체를 커스터마이징하는 방법을 학습할 수 있습니다. 경로 기반 표현식을 사용하여 중첩된 필드를 설정하는 방법은 객체 커스터마이징 문서를 참조합니다.

추가 리소스

심화 학습

더 깊은 이해를 위해 다음 주제를 학습하는 것을 권장합니다:

  1. Introspector 상세: 다양한 Introspector의 동작 방식과 적용 시나리오
  2. 플러그인 활용: Jackson, Validation, Mockito 등과의 통합
  3. 고급 커스터마이징: 복잡한 객체 그래프와 조건부 설정