본문 바로가기
카테고리 없음

Fixture Monkey 테스트 자동화

by sujupark54 2026. 2. 9.

코딩 픽스쳐 몽키

테스트 코드를 작성하다 보면 가장 먼저 마주치는 피로 요소 중 하나가 테스트 데이터 생성이다. 필드가 많아질수록 생성자는 길어지고, 빌더 패턴을 사용하더라도 테스트의 핵심과는 무관한 코드가 늘어난다. 이러한 반복 작업을 줄이기 위해 등장한 도구가 Fixture Monkey다.


Fixture Monkey 개요

Fixture Monkey는 테스트에서 사용할 객체를 무작위이면서도 유효한 값으로 자동 생성해주는 라이브러리다. 단순히 랜덤 값을 채워주는 수준이 아니라, 객체 구조를 분석하고 필드 타입에 맞는 값을 생성하며, 사용자가 원하는 조건을 추가로 적용할 수 있다.

테스트 코드에서 중요한 것은 객체를 어떻게 만들었는지가 아니라 그 객체로 무엇을 검증하느냐다. 하지만 현실에서는 객체 생성 코드가 테스트 본문보다 길어지는 경우가 많다. Fixture Monkey는 이러한 문제를 해결해 테스트의 의도를 더 명확하게 드러내도록 돕는다.

의존성 추가 후, FixtureMonkey 인스턴스를 생성하면 단 한 줄로 객체를 얻을 수 있다. 필드가 많고 복잡한 클래스일수록 효과는 더 분명해진다.


testImplementation "com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.14"

FixtureMonkey fixtureMonkey = FixtureMonkey.builder().build();
Product product = fixtureMonkey.giveMeOne(Product.class);

이처럼 Fixture Monkey는 테스트 코드의 가독성을 높이고 불필요한 준비 코드를 제거하는 데 큰 도움을 준다.


Fixture Monkey Introspector

Fixture Monkey가 객체를 생성하는 방식은 Introspector에 의해 결정된다. Introspector는 “이 객체를 어떤 방식으로 생성할 것인가”를 정의하는 전략이다. 클래스 구조와 생성 방식에 따라 적절한 Introspector를 선택하는 것이 중요하다.

가장 기본적인 방식은 BeanArbitraryIntrospector다. 리플렉션과 setter 메서드를 활용해 객체를 생성하며, 일반적인 Java Bean 구조에 적합하다.


FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
    .objectIntrospector(BeanArbitraryIntrospector.INSTANCE)
    .build();

생성자를 기반으로 객체를 만들고 싶다면 ConstructorPropertiesArbitraryIntrospector를 사용할 수 있다. 레코드 타입이나 명시적인 생성자를 사용하는 클래스에 적합하다.

이외에도 필드를 직접 조작하는 FieldReflectionArbitraryIntrospector, 빌더 패턴을 사용하는 BuilderArbitraryIntrospector 등이 있다. 여러 방식을 동시에 사용하고 싶다면 FailoverIntrospector를 통해 순차적으로 생성 전략을 시도할 수 있다.


FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
    .objectIntrospector(new FailoverIntrospector(
        List.of(
            FieldReflectionArbitraryIntrospector.INSTANCE,
            ConstructorPropertiesArbitraryIntrospector.INSTANCE,
            BuilderArbitraryIntrospector.INSTANCE
        )
    ))
    .build();

이처럼 Introspector 설정은 Fixture Monkey를 프로젝트 구조에 자연스럽게 녹여내는 핵심 요소다.


Fixture Monkey 커스터마이징

무작위 생성은 편리하지만 테스트 의도와 맞지 않는 값이 생성될 수도 있다. Fixture Monkey는 ArbitraryBuilder를 통해 생성 결과를 세밀하게 제어할 수 있다.

set() 메서드를 사용하면 특정 필드의 값을 고정할 수 있으며, 나머지 필드는 기존 방식대로 랜덤 생성된다.


Product product = fixtureMonkey.giveMeBuilder(Product.class)
    .set("productName", "lkdcode")
    .sample();

컬렉션 필드에 대해서는 size(), minSize(), maxSize()를 통해 크기를 제어할 수 있고, setNull(), setNotNull()을 활용해 널 처리도 명확하게 할 수 있다.

또한 Jakarta Validation 플러그인을 추가하면 @NotBlank, @Min, @Size 같은 유효성 조건을 만족하는 값만 생성되도록 제어할 수 있다. 이로 인해 테스트 단계에서 유효하지 않은 객체로 인한 불필요한 오류를 줄일 수 있다.


FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
    .plugin(new JakartaValidationPlugin())
    .build();

Fixture Monkey의 강점은 단순 자동 생성이 아니라 “테스트 의도에 맞게 조절 가능한 자동화”에 있다. 적절히 활용하면 테스트 코드의 품질과 유지보수성을 동시에 개선할 수 있다.