Web/spring-boot

Fixture Monkey로 테스트에서 객체를 자동으로 생성해보자

부에나온다 2024. 2. 13. 10:08

Fixture Monkey 란?

  • 2023년 11월 10일 네이버의 오픈소스 픽스쳐 몽키가 정식 릴리즈 되었습니다.
  • 픽스쳐 몽키는 코틀린, 자바에서 테스트 객체를 자동으로 생성하는 라이브러리 입니다.
  • 테스트용 객체를 만드는데 생성자나, Builder 패턴을 사용하여 번거럽고 시간이 많이 걸리는 일을 줄여 간결하고 생산성있는 테스트코드를 작성하는데 도움을 줍니다.
  • https://github.com/naver/fixture-monkey?tab=readme-ov-file

Maven 의존성 추가

<dependency>
    <groupId>com.navercorp.fixturemonkey</groupId>
    <artifactId>fixture-monkey-starter</artifactId>
    <version>1.0.0</version>
    <scope>test</scope>
</dependency>

사용방법

  • Lombok 을 사용할 경우
    • 롬복으로 생성자를 만들 경우 ConstructorPropertiesArbitraryIntrospector을 사용해야 합니다.
@Test
void test() {
    // given
    FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
        .build();

    // when
    User actual = fixtureMonkey.giveMeOne(User.class);

    // then
    then(actual).isNotNull();
}
  • Lombok 을 사용하지 않을 경우
@Test
void test() {
    // given
    FixtureMonkey fixtureMonkey = FixtureMonkey.create();

    // when
    User actual = fixtureMonkey.giveMeOne(User.class);

    // then
    then(actual).isNotNull();
}

이렇게 해서 객체를 만들경우 해당 객체의 필드값은 랜덤하게 들어가게 됩니다.

객체 생성 Method

  • giveMe()
    • 기본적으로 객체가 필요한 경우 사용합니다.
    • 기본적으로 랜덤한 값이 배정됩니다.
    • 원하는 컬렉션 크기도 지정이 가능합니다.
List<User> userList = fixtureMonkey.giveMe(User.class, 3);
List<List<String>> strListList = fixtureMonkey.giveMe(new TypeReference<List<String>>() {}, 3);
  • giveMeBuilder()
    • 생성할 객체를 좀더 자세히 다뤄야하는 경우 사용
    • 객체 일부 필드의 값을 랜덤값이 아닌 값으로 지정해줄 수 있다.
 FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
            .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
            .build();

User actual = fixtureMonkey.giveMeBuilder(User.class)
    .set(javaGetter(User::getName), "제이콥")
    .minSize(javaGetter(User::getOptions), 1)   
    .sample();

정리

  • 이렇게 간단하게 Fixture Monkey를 사용하는 방법에 대해서 알아봤습니다.
  • 테스트코드의 작성하는데 소요되는 시간을 줄여주고, 가독성도 확보되는 이점이 있는거 같습니다.