Fixture Monkey 0.4.x
이 글은 24.05 기준 더 이상 유효하지 않습니다. 대신 테스트를 쉽고 편리하게, Fixture Monkey를 참고해주세요.
Overview
FixtureMonkey
가 0.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 가 이전에 비해 좀 부실해진거 같은데...