빠른 시작 가이드
학습 내용
- Fixture Monkey로 테스트 객체를 커스터마이징하는 핵심 방법
- 단순하고 복잡한 객체를 커스터마이징하는 기본 접근법
- 초보자가 자주 겪는 문제의 해결책
5분 빠른 시작
이 섹션은 Fixture Monkey를 시작하는 데 필요한 핵심 정보만 다룹니다.
꼭 알아야 할 4가지 핵심 메서드
시간이 없다면, 지금 꼭 알아야 할 내용은 다음과 같습니다. 먼저 FixtureMonkey 인스턴스를 생성합니다:
FixtureMonkey fixtureMonkey = FixtureMonkey.create();
그런 다음 다음 핵심 메서드를 사용합니다:
- Java
- Kotlin
// 특정 속성 값으로 상품 생성
Product product = fixtureMonkey.giveMeBuilder(Product.class)
.set("name", "스마트폰") // 속성 설정
.set("price", new BigDecimal(499)) // 다른 속성 설정
.sample(); // 실제 객체 생성
// 상품 목록이 있는 주문 생성
Order order = fixtureMonkey.giveMeBuilder(Order.class)
.size("products", 2) // 리스트 크기를 2로 설정
.set("products[0].name", "노트북") // 리스트 요소 커스터마이징
.sample();
// 특정 속성 값으로 상품 생성
val product = fixtureMonkey.giveMeBuilder<Product>()
.setExp(Product::name, "스마트폰") // 속성 설정
.setExp(Product::price, BigDecimal(499)) // 다른 속성 설정
.sample() // 실제 객체 생성
// 상품 목록이 있는 주문 생성
val order = fixtureMonkey.giveMeBuilder<Order>()
.sizeExp(Order::products, 2) // 리스트 크기를 2로 설정
.set("products[0].name", "노트북") // 리스트 요소 커스터마이징
.sample()
시각적 개요
다음은 Fixture Monkey로 객체를 커스터마이징하는 과정을 보여주는 간단한 순서도입니다:
사전 요구사항
이 가이드는 다음을 가정합니다:
- 이미 프로젝트에 Fixture Monkey를 추가했습니다
- 기본 FixtureMonkey 인스턴스를 생성하는 방법을 알고 있습니다
아직 Fixture Monkey를 설정하지 않았다면, 먼저 시작하기 섹션을 참고하세요.
기본 커스터마이징 방법
이 섹션은 일상적으로 사용하게 될 가장 기본적인 커스터마이징 방법을 소개합니다.
속성 값 설정하기
객체를 커스터마이징하는 가장 기본적인 방법은 특정 속성 값을 설정하는 것입니다:
- Java
- Kotlin
Product product = fixtureMonkey.giveMeBuilder(Product.class)
.set("name", "스마트폰")
.set("price", new BigDecimal("499.99"))
.set("available", true)
.sample();
val product = fixtureMonkey.giveMeBuilder<Product>()
.setExp(Product::name, "스마트폰")
.setExp(Product::price, BigDecimal("499.99"))
.setExp(Product::available, true)
.sample()
null 값 설정하기
null 값으로 테스트해야 할 때:
- Java
- Kotlin
Product nullNameProduct = fixtureMonkey.giveMeBuilder(Product.class)
.setNull("name") // 이름을 null로 설정
.sample();
val nullNameProduct = fixtureMonkey.giveMeBuilder<Product>()
.setNullExp(Product::name) // 이름을 null로 설정
.sample()
컬렉션 다루기
컬렉션을 다룰 때 가장 중요한 것은 먼저 크기를 설정하는 것입니다:
- Java
- Kotlin
// 2개의 상품이 있는 주문 생성
Order orderWith2Products = fixtureMonkey.giveMeBuilder(Order.class)
.size("products", 2) // 먼저 크기 설정
.set("products[0].name", "노트북") // 그 다음 요소 커스터마이징
.sample();
// 2개의 상품이 있는 주문 생성
val orderWith2Products = fixtureMonkey.giveMeBuilder<Order>()
.sizeExp(Order::products, 2) // 먼저 크기 설정
.set("products[0].name", "노트북") // 그 다음 요소 커스터마이징
.sample()
더 고급 컬렉션 커스터마이징은 경로 표현식 문서를 확인하세요.
중첩 객체 커스터마이징
점 표기법을 사용하여 중첩된 속성에 접근할 수 있습니다:
- Java
- Kotlin
// 주소가 있는 고객 생성
Customer customer = fixtureMonkey.giveMeBuilder(Customer.class)
.set("name", "홍길동")
.set("address.street", "123 메인 스트리트") // 중첩 속성
.set("address.city", "서울") // 중첩 속성
.sample();
// 주소가 있는 고객 생성
val customer = fixtureMonkey.giveMeBuilder<Customer>()
.setExp(Customer::name, "홍길동")
.set("address.street", "123 메인 스트리트") // 중첩 속성
.set("address.city", "서울") // 중첩 속성
.sample()
더 복잡한 중첩 객체 커스터마이징은 InnerSpec 가이드를 확인하세요.
자주 묻는 질문
초보자가 자주 겪는 가장 일반적인 문제들입니다.
요소를 커스터마이징하려고 했는데 컬렉션이 비어있는 이유는 무엇인가요?
크기를 먼저 지정하지 않고 컬렉션 요소를 설정하면(예: .size(...) 없이 .set("products[0].name", "노트북") 사용), 컬렉션이 비어있어 해당 요소 설정이 무시될 수 있습니다.
컬렉션 요소를 커스터마이징하기 전에 반드시 컬렉션 크기를 먼저 설정하세요.
해결 방법:
- Java
- Kotlin
// 잘못된 방법 - 컬렉션이 비어있을 수 있음
Order orderWrong = fixtureMonkey.giveMeBuilder(Order.class)
.set("products[0].name", "노트북") // 이것은 작동하지 않을 수 있습니다!
.sample();
// 올바른 방법 - 먼저 크기 설정
Order orderCorrect = fixtureMonkey.giveMeBuilder(Order.class)
.size("products", 1) // 먼저 크기 설정!
.set("products[0].name", "노트북") // 이제 작동합니다
.sample();
// 잘못된 방법 - 컬렉션이 비어있을 수 있음
val orderWrong = fixtureMonkey.giveMeBuilder<Order>()
.set("products[0].name", "노트북") // 이것은 작동하지 않을 수 있습니다!
.sample()
// 올바른 방법 - 먼저 크기 설정
val orderCorrect = fixtureMonkey.giveMeBuilder<Order>()
.sizeExp(Order::products, 1) // 먼저 크기 설정!
.set("products[0].name", "노트북") // 이제 작동합니다
.sample()
null로 설정하지 않았는데 왜 null 값이 생성되나요?
기본적으로 Fixture Monkey는 일부 속성에 대해 null 값을 생성할 수 있습니다. 값이 null이 아니도록 하려면:
- Java
- Kotlin
Product nonNullProduct = fixtureMonkey.giveMeBuilder(Product.class)
.setNotNull("name") // 이름이 null이 아님을 보장
.setNotNull("price") // 가격이 null이 아님을 보장
.sample();
val nonNullProduct = fixtureMonkey.giveMeBuilder<Product>()
.setNotNullExp(Product::name) // 이름이 null이 아님을 보장
.setNotNullExp(Product::price) // 가격이 null이 아님을 보장
.sample()
다음 단계
이제 기본을 배웠으니, 더 고급 사용법을 위해 다음 주제를 살펴보세요:
- 경로 표현식 - 중첩 속성 접근 및 커스터마이징
- 커스터마이징 API - 커스터마이징 메서드 전체 목록
- 인터페이스 테스트 - 인터페이스 작업 방법
- InnerSpec - 복잡한 객체를 위한 고급 커스터마이징
- Arbitrary - 특정 제약 조건이 있는 테스트 데이터 생성