v1.2.x
v1.2.1
Features
- object-farm-api (
0.1.3→0.1.4):InlinedValueResolver와FieldExtractor#reflection(InlinedValueResolver)오버로드를 추가했습니다. JVM 언어 플러그인이 해당 언어가 소유 객체의 필드에 인라인한 value 타입을 복원할 수 있습니다.
Improvements
JvmTypeSystem(EXPERIMENTAL)이assemblyPlanner(AssemblyPlanner)대신 플러그인이 제공하는 개별 부품 —nodePromoters(...),leafTypeResolvers(...),candidateGeneratorWrapper(...),inlinedValueResolver(...)— 을 받습니다. 모든 플러그인이 적용된 후FixtureMonkeyBuilder가 이 부품들로 단일AssemblyPlanner를 생성합니다. 그 결과JvmTypeSystemPlugin을 여러 개 등록하면 각 플러그인이 등록한 항목이 합쳐집니다. 이전에는 마지막 플러그인이 앞선 등록을 덮어썼습니다.
Bug Fixes
- Kotlin
value class프로퍼티를 가진 객체를 통째로set(...)에 넘길 때 발생하던IllegalArgumentException을 수정했습니다.kotlin.time.Duration,UInt처럼 언어가 소유 객체의 필드에 인라인하는 모든 타입에 동일하게 적용되며,PropertyNameResolver로 이름이 바뀐 프로퍼티(예: Jackson의@JsonProperty)도 함께 처리됩니다.
v1.2.0
0.4.0부터 기본 엔진이었던 레거시 object tree 엔진이 제거되고, 1.1.17에서 실험적으로 도입되었던 adapter 엔진이 이제 유일한 기본 객체 생성 엔진이 되었습니다. FixtureMonkeyBuilder가 자동으로 연결합니다.
일상적으로 사용하는 API(ArbitraryBuilder, giveMe*, set/size/thenApply)는 변경되지 않았습니다. 기존 엔진 내부에 연결되던 확장 지점은 제거되었으므로 Breaking Changes를 확인하세요. 커스텀 Property / PropertyGenerator / ArbitraryIntrospector를 직접 구현한 경우 이번 릴리스를 주의 깊게 검토하세요.
Features
- JVM 언어용 확장 SPI인
JvmTypeSystemPlugin/JvmTypeSystem/LeafTypeRegistry를 추가했습니다. 플러그인이FixtureMonkeyBuilder.plugin(...)을 통해 커스텀AssemblyPlanner를 설치할 수 있습니다. - 값 생성 디버깅을 위해 resolution tracer를 직접 연결하는
FixtureMonkeyBuilder#tracer(AssemblyTracer)를 추가했습니다. TypeReference#getJvmType()와ArbitraryGeneratorContext#getResolvedJvmType()를 추가했습니다.Types#normalizeRawType(...),Types#toJvmType(...)오버로드,Types#toAnnotatedType(JvmType)유틸리티를 추가했습니다.
Improvements
@Seed가FixtureMonkeyBuilder#seed(long)보다 우선 적용되며, seed가 테스트 단위로 스코프되고 해제됩니다. 테스트나 다른 extension이 예외를 던져도 해제됩니다. 이전에는 global seed가 테스트 간에 누수되거나 builder의 기본값(System.nanoTime())에 의해 덮어써질 수 있었습니다.- 컨테이너 크기가 같은 seed로 재실행 시 재현 가능해졌습니다. 컨테이너 크기 randomness가 값 생성과 분리된 전용 counter로 추적되어, 다른 곳의 cache hit/miss 패턴이 크기에 영향을 주지 않습니다.
- 객체 생성이 선언/iteration 순서를 유지합니다(
HashMap대신LinkedHashMap). Kotlin aliased constructor 파라미터에 값이 잘못된 파라미터로 들어가던 문제를 수정합니다. 이로 인해 같은 seed에서도 생성되는 random stream이 1.1.x와 달라질 수 있습니다. FixtureMonkeyOptionsBuilder#defaultNullInjectGeneratorOperator(...)가 이전 operator를 덮어쓰지 않고 연속으로 합성(compose)합니다..size()의 wildcard와 exact-path 우선순위가 빌드 시점에 결정되어, 우선순위가 높은 wildcard 크기가 가려진 exact path에도 올바르게 적용됩니다.
Bug Fixes
- primitive 타입 슬롯에
null을 주입하려다 발생하던IllegalArgumentException을 방지합니다. null이 주입될 path에postCondition/filter 술어(predicate)가 등록된 경우 발생하던NullPointerException을 방지합니다.- anonymous-interface proxy로 해석되는 self-referential 인터페이스 프로퍼티에서 발생하던
StackOverflowError를 방지합니다. - 재귀/self-referential 컨테이너 타입(예:
List<Self>를 포함하는 타입)이 생성 불가능한 child를 만들던 문제를 수정합니다. - Kotlin
Pair/Triple같은 커스텀 컨테이너 타입을 올바르게 인식합니다. - 중첩 타입에 대해 per-type introspector chain(예:
PriorityConstructorArbitraryIntrospector)이 잘못된PropertyGenerator를 사용하던 문제를 수정합니다.
Deprecations
ArbitraryGeneratorContext#getResolvedType()와#getResolvedAnnotatedType()를 deprecated 처리했습니다.#getResolvedJvmType()를 사용하세요.PropertyUtils#toProperty(AnnotatedType)를 deprecated 처리했습니다. 새toProperty(JvmType)오버로드를 사용하세요.
Breaking Changes
Property인터페이스:getType()제거(getJvmType()사용),getAnnotatedType()제거,getValue(Object)제거(값 추출은 더 이상Property계약의 일부가 아닙니다). 이에 따라 내장 구현체(FieldProperty,ConstructorProperty,RootProperty,MapEntryElementProperty등)의 생성자 시그니처가 변경되었습니다.ArbitraryGeneratorContext#getResolvedType()의 반환 타입이java.lang.reflect.Type에서Class<?>로 변경되었습니다.ContainerPropertyGenerator.DEFAULT_ELEMENT_RAW_TYPE를 제거했습니다.DEFAULT_ELEMENT_JVM_TYPE를 사용하세요.- 레거시 생성 엔진을 제거했습니다:
c.n.f.tree.*패키지,c.n.f.expression.*(ArbitraryExpression,MonkeyExpression,MonkeyExpressionFactory), manipulator 패밀리(NodeManipulator,ArbitraryManipulator,ContainerInfoManipulator등)와NodeResolverSPI. 이제AssemblyPlanner가 자동으로 사용됩니다. - 1.1.17에서 추가된 실험적 adapter-bridge SPI를 제거했습니다:
NodeTreeAdapter,DefaultNodeTreeAdapter,JavaNodeTreeAdapterPlugin, Kotlin의KotlinNodeTreeAdapterPlugin. 자동으로 동작하는AssemblyPlanner+JvmTypeSystemPlugin으로 대체되었습니다. FixtureMonkeyOptionsBuilder#nodeTreeAdapter(...)/#adapterTracer(...)와 대응하는FixtureMonkeyOptionsgetter를 제거했습니다.FixtureMonkeyBuilder#tracer(AssemblyTracer)를 사용하세요.- object-farm-api (
0.1.2→0.1.3):JavaType클래스를 제거했습니다(ReflectiveJvmType사용). deprecated였던JvmType#getAnnotatedType()도 제거했습니다.