Skip to main content

Fixture Monkey 0.4.x

· 4 min read
Haril Song
Owner, Software Engineer at 42dot
warning

이 글은 24.05 기준 더 이상 유효하지 않습니다. 대신 테스트를 쉽고 편리하게, Fixture Monkey를 참고해주세요.

Overview

FixtureMonkey0.4.x 으로 업데이트되면서 많은 기능의 변경이 있었다. 이전 글1을 작성한지 채 한달도 되지 않았는데 많은 수정이 발생해서(ㅠ) 당황스러웠지만, 커뮤니티가 활발한 신호라는 점으로 마음을 위로하면서 업데이트된 부분을 반영하여 새로 글을 작성한다.

Changes

LabMonkey

실험적인 기능이 추가된 인스턴스.

FixtureMonkey 를 상속하여 기존 기능을 지원하면서 몇가지 메서드들이 추가되었다. 전체적인 사용방법은 비슷하니, FixtureMonkey 대신에 LabMonkey 를 사용하면 될 것 같다. 1.0.0 이후로는 LabMonkey 의 기능을 deprecated 하고 같은 기능을 FixtureMonkey 에서 제공할 예정이라고 한다.

private final LabMonkey fixture = LabMonkey.create();

객체 생성 방식의 변경

ArbitraryGenerator 가 아닌 ArbitraryIntrospector 가 담당하도록 변경되었다.

Record 지원

이제 Record 또한 FixtureMonkey 를 통해 생성할 수 있다.

public record LottoRecord(int number) {}
class LottoRecordTest {

private final LabMonkey fixture = LabMonkey.labMonkeyBuilder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.build();

@Test
void shouldBetween1to45() {
LottoRecord lottoRecord = fixture.giveMeOne(LottoRecord.class);

System.out.println("lottoRecord: " + lottoRecord);

assertThat(lottoRecord).isNotNull();
}
}
lottoRecord: LottoRecord[number=-6]

ConstructorPropertiesArbitraryIntrospector 를 사용하여 객체를 생성하면 Record 객체를 생성할 수 있다. 0.3.x 버전에서는 ConstructorProperties annotation 이 필요했었는데 이젠 프로덕션 코드에 수정을 가하지 않아도 되니 꽤나 큰 변화라고 할 수 있겠다.

이외에도 다양한 Introspector 가 존재하여 객체의 형태에 맞는 방식으로 객체 생성을 지원한다.

Plugin

private final LabMonkey fixture = LabMonkey.labMonkeyBuilder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.plugin(new JavaxValidationPlugin())
.build();

plugin() 이라는 fluent api 를 통해 간편하게 plugin 을 추가할 수 있다. JavaxValidationPlugin 을 추가해주면 java bean validation 기능을 적용하여 객체를 생성할 수 있다.

일종의 데코레이터 패턴이라고 생각되는데, 여러가지 서드파티 플러그인의 개발 및 적용이 용이해질 것으로 보인다.

public record LottoRecord(
@Min(1)
@Max(45)
int number
) {
public LottoRecord {
if (number < 1 || number > 45) {
throw new IllegalArgumentException("로또 번호는 1~45 사이의 숫자여야 합니다.");
}
}
}
@RepeatedTest(100)
void shouldBetween1to45() {
LottoRecord lottoRecord = fixture.giveMeOne(LottoRecord.class);

assertThat(lottoRecord.number()).isBetween(1, 45);
}

Conclusion

이전 글에서 아쉽다고 언급했던 부분이 거의 대부분 개선되어서 정말 만족스럽게 사용 중이다. 근데 어째 document2 가 이전에 비해 좀 부실해진거 같은데...

Reference

Footnotes

  1. FixtureMonkey 0.3.0 - 객체생성전략

  2. FixtureMonkey