사용자 정의 객체 생성하기

특정 단위 테스트에 맞게 테스트 픽스처를 조정해야할 수 있습니다. 이런 경우에는 Fixture Monkey 를 사용하여 빌더를 생성하고 특정 명세를 추가할 수 있습니다.

@Value
public class Product {
    long id;

    String productName;

    long price;

    List<String> options;

    Instant createdAt;
}

예를 들면, 특정 테스트에서 id 가 1,000 인 Product 인스턴스가 필요할 수 있습니다.

이를 위해 giveMeBuilder 메서드를 사용하여 픽스처 몽키에서 타입 빌더를 가져올 수 있습니다. 빌더를 사용하면 추가 메서드 호출을 연결하여 픽스처를 사용자 정의할 수 있습니다. 위 예시의 경우에는 set() 함수를 사용하여 id를 1,000으로 설정하고, sample()을 사용하여 인스턴스를 생성해줄 수 있습니다.

@Test
void test() {
    // given
    FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
        .build();
    long id = 1000;

    // when
    Product actual = fixtureMonkey.giveMeBuilder(Product.class)
        .set("id", id)
        .sample();

    // then
    then(actual.getId()).isEqualTo(1000);
}

위의 코드의 검증문에서 필드 id가 원하는 값으로 설정되어 있는 것을 볼 수 있습니다.

컬렉션을 사용하는 경우에도 Fixture Monkey 를 사용할 수 있습니다. 예를 들어, “options” 리스트가 특정 크기를 가져야 하고, 리스트의 특정 요소가 특정 값을 가져야 할 수 있습니다.

@Test
void test() {
    // given
    FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
        .build();

    // when
    Product actual = fixtureMonkey.giveMeBuilder(Product.class)
        .size("options", 3)
        .set("options[1]", "red")
        .sample();

    // then
    then(actual.getOptions()).hasSize(3);
    then(actual.getOptions().get(1)).isEqualTo("red");
}

set() 함수를 사용하여 특정 컬렉션 (list, set, map)의 크기를 지정하고 요소를 특정 값으로 설정한 다음, sample() 메서드를 호출하여 인스턴스를 생성할 수 있습니다.

표현식을 사용하여 프로퍼티를 선택하고 프로퍼티 값을 설정하는 방법에 대한 자세한 예제는 커스터마이징 항목 을 참고하세요.