빠른 시작
관련 소스 파일
이 페이지의 내용은 다음 소스 파일을 기반으로 생성되었습니다:
- README.md
- docs/docs/get-started/requirements.md
- docs/docs/get-started/creating-objects.md
- fixture-monkey-starter/build.gradle.kts
- fixture-monkey-starter-kotlin/build.gradle.kts
- build.gradle.kts
- docs/package.json
- buildSrc/build.gradle.kts
- fixture-monkey/build.gradle.kts
- object-farm-api/build.gradle.kts
Fixture Monkey는 Java와 Kotlin을 위한 테스트 픽스처 생성 라이브러리로, 복잡한 테스트 객체를 간편하게 생성할 수 있도록 설계되었습니다. 경로 기반 표현식을 통해 중첩된 필드에 자유롭게 접근하고 구성할 수 있는 것이 가장 두드러진 특징입니다 (README.md:11-18).
이 라이브러리는 테스트 작성을 단순화하는 데 중점을 두고 있으며, "Write once, Test anywhere"라는 철학을 따릅니다. JVM 테스트를 더 간결하고 안전하게 만드는 것을 목표로 합니다 (README.md:1-28).
요구사항
필수 환경
Fixture Monkey를 사용하기 위해서는 다음 환경이 필요합니다:
| 구성 요소 | 버전 요구사항 | 비고 |
|---|---|---|
| JDK | 1.8 이상 | 또는 Kotlin 1.8 이상 |
| JUnit 5 Platform | 필수 | 테스트 프레임워크 |
| jqwik | 1.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-starter | Java용 스타터 의존성 |
| fixture-monkey-kotlin | Kotlin 지원 |
| fixture-monkey-starter-kotlin | Kotlin용 스타터 의존성 |
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에 다음을 추가합니다:
groovy1testRuntimeOnly("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 프로젝트의 경우:
groovy1// Kotlin 2testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter-kotlin:1.1.18")
상세 설정 예시는 README.md:31-61에서 확인할 수 있습니다.
Maven 설정
Java 프로젝트의 경우 pom.xml에 다음을 추가합니다:
xml1<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 프로젝트의 경우:
xml1<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를 사용한 테스트 객체 생성은 매우 간단합니다. 가장 기본적인 방법은 다음과 같습니다:
java1// Java 2FixtureMonkey fixtureMonkey = FixtureMonkey.create(); 3Product product = fixtureMonkey.giveMeOne(Product.class);
kotlin1// Kotlin 2val fixtureMonkey = FixtureMonkey.create() 3val product = fixtureMonkey.giveMeOne<Product>()
이 코드를 실행하면 Fixture Monkey가 무작위 값으로 채워진 Product 인스턴스를 생성합니다 (README.md:63-74).
생성된 객체 예시
생성된 객체는 실행할 때마다 다른 값을 가지며, 예시는 다음과 같습니다:
java1Product( 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 패턴을 사용할 수 있습니다:
java1@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 / @AllArgsConstructor | ConstructorPropertiesArbitraryIntrospector |
| 기본 생성자 + setter | BeanArbitraryIntrospector (기본값) |
| Jackson 어노테이션 | JacksonObjectArbitraryIntrospector (Jackson Plugin 필요) |
| Kotlin data class | PrimaryConstructorArbitraryIntrospector (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을 추가해야 합니다:
kotlin1val sut = FixtureMonkey.builder() 2 .plugin(KotlinPlugin()) 3 .build()
Kotlin 예제는 README.md:96-115에서 확인할 수 있습니다.
실행 검증
테스트 실행 확인
의존성을 올바르게 추가했는지 확인하려면 간단한 테스트를 작성합니다:
java1@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).
빌드 구성 확인
프로젝트 빌드 파일에서 다음을 확인합니다:
fixture-monkey-starter의존성이testImplementation스코프로 추가되었는지 확인- JUnit 5 Platform이 활성화되었는지 확인 (fixture-monkey-starter/build.gradle.kts:17-19)
일반적인 문제와 해결 방법
문제 1: 객체 생성 실패
증상: giveMeOne() 호출 시 예외 발생
원인: 잘못된 Introspector 선택
해결 방법: 클래스 구조에 맞는 Introspector를 선택합니다. Lombok @Value 클래스를 사용하는 경우 ConstructorPropertiesArbitraryIntrospector.INSTANCE를 사용하고, lombok.config에 lombok.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).
다음 단계
객체 커스터마이징
기본 객체 생성을 마스터했다면, 이제 테스트 시나리오에 맞게 객체를 커스터마이징하는 방법을 학습할 수 있습니다. 경로 기반 표현식을 사용하여 중첩된 필드를 설정하는 방법은 객체 커스터마이징 문서를 참조합니다.
추가 리소스
- FAQ: 자주 묻는 질문은 FAQ 페이지에서 확인할 수 있습니다 (README.md:207).
- 서드파티 모듈: Jackson, Mockito, Jakarta Validation 등의 플러그인은 플러그인 문서에서 확인할 수 있습니다 (README.md:209).
- IntelliJ 플러그인: FixtureMonkey Helper 플러그인을 사용하면 Fixture Monkey 사용이 더욱 편리해집니다 (README.md:212).
심화 학습
더 깊은 이해를 위해 다음 주제를 학습하는 것을 권장합니다:
- Introspector 상세: 다양한 Introspector의 동작 방식과 적용 시나리오
- 플러그인 활용: Jackson, Validation, Mockito 등과의 통합
- 고급 커스터마이징: 복잡한 객체 그래프와 조건부 설정
