diff --git a/docs/content/v1.0.x/release-notes/_index.md b/docs/content/v1.0.x/release-notes/_index.md index 7d624b5054..7c188d218f 100644 --- a/docs/content/v1.0.x/release-notes/_index.md +++ b/docs/content/v1.0.x/release-notes/_index.md @@ -8,6 +8,8 @@ weight: 100 ### v1.0.9 Fix addExceptGenerateClass option affected by specific ArbitraryIntrospector +Add customizing Wildcard type in an option + ##### Experimental Feature Add `customizeProperty` API in `ArbitraryBuilder` to customize a generated value. diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptions.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptions.java index c37cea3e30..0bafa78e66 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptions.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptions.java @@ -42,6 +42,7 @@ import org.apiguardian.api.API; import org.apiguardian.api.API.Status; +import com.navercorp.fixturemonkey.api.arbitrary.CombinableArbitrary; import com.navercorp.fixturemonkey.api.constraint.JavaConstraintGenerator; import com.navercorp.fixturemonkey.api.container.DecomposedContainerValueFactory; import com.navercorp.fixturemonkey.api.generator.ArbitraryContainerInfoGenerator; @@ -62,6 +63,7 @@ import com.navercorp.fixturemonkey.api.generator.StreamContainerPropertyGenerator; import com.navercorp.fixturemonkey.api.instantiator.InstantiatorProcessor; import com.navercorp.fixturemonkey.api.introspector.ArbitraryIntrospector; +import com.navercorp.fixturemonkey.api.introspector.ArbitraryIntrospectorResult; import com.navercorp.fixturemonkey.api.introspector.NullArbitraryIntrospector; import com.navercorp.fixturemonkey.api.matcher.AssignableTypeMatcher; import com.navercorp.fixturemonkey.api.matcher.DoubleGenericTypeMatcher; @@ -73,6 +75,7 @@ import com.navercorp.fixturemonkey.api.property.PropertyGenerator; import com.navercorp.fixturemonkey.api.property.PropertyNameResolver; import com.navercorp.fixturemonkey.api.type.Types; +import com.navercorp.fixturemonkey.api.type.Types.GeneratedWildcardType; import com.navercorp.fixturemonkey.api.type.Types.UnidentifiableType; import com.navercorp.fixturemonkey.api.validator.ArbitraryValidator; @@ -84,8 +87,12 @@ public final class FixtureMonkeyOptions { public static final List> DEFAULT_CONTAINER_PROPERTY_GENERATORS = getDefaultContainerPropertyGenerators(); public static final List> DEFAULT_ARBITRARY_INTROSPECTORS = - Collections.singletonList( - MatcherOperator.exactTypeMatchOperator(UnidentifiableType.class, NullArbitraryIntrospector.INSTANCE) + Arrays.asList( + MatcherOperator.exactTypeMatchOperator(UnidentifiableType.class, NullArbitraryIntrospector.INSTANCE), + MatcherOperator.exactTypeMatchOperator( + GeneratedWildcardType.class, + context -> new ArbitraryIntrospectorResult(CombinableArbitrary.from(new Object())) + ) ); public static final ObjectPropertyGenerator DEFAULT_OBJECT_PROPERTY_GENERATOR = DefaultObjectPropertyGenerator.INSTANCE; diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptionsBuilder.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptionsBuilder.java index 03465c8071..aaf1a5c6d9 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptionsBuilder.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/option/FixtureMonkeyOptionsBuilder.java @@ -98,7 +98,7 @@ public final class FixtureMonkeyOptionsBuilder { private ArbitraryContainerInfoGenerator defaultArbitraryContainerInfoGenerator; private ArbitraryGenerator defaultArbitraryGenerator; private UnaryOperator defaultArbitraryGeneratorOperator = it -> it; - private final List> arbitraryIntrospectors = + private List> arbitraryIntrospectors = new ArrayList<>(DEFAULT_ARBITRARY_INTROSPECTORS); private final JavaDefaultArbitraryGeneratorBuilder javaDefaultArbitraryGeneratorBuilder = IntrospectedArbitraryGenerator.javaBuilder(); @@ -367,7 +367,7 @@ public FixtureMonkeyOptionsBuilder defaultArbitraryContainerInfoGenerator( public FixtureMonkeyOptionsBuilder insertFirstArbitraryIntrospector( MatcherOperator arbitraryIntrospector ) { - this.arbitraryIntrospectors.add(arbitraryIntrospector); + this.arbitraryIntrospectors = insertFirst(this.arbitraryIntrospectors, arbitraryIntrospector); return this; } diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/Types.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/Types.java index cf9dc5715d..fa54bd5875 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/Types.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/Types.java @@ -91,6 +91,9 @@ public static Class getActualType(AnnotatedType annotatedType) { public static Class getActualType(Type type) { if (type.getClass() == Class.class) { + if (type == Object.class) { + return GeneratedWildcardType.class; + } return (Class)type; } @@ -397,6 +400,11 @@ private UnidentifiableType() { } } + public static class GeneratedWildcardType { + private GeneratedWildcardType() { + } + } + public static Class primitiveToWrapper(final Class cls) { Class convertedClass = cls; if (cls != null && cls.isPrimitive()) { diff --git a/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotlinTest.kt b/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotlinTest.kt index 361a5762bf..5d50ac2bd0 100644 --- a/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotlinTest.kt +++ b/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotlinTest.kt @@ -19,11 +19,14 @@ package com.navercorp.fixturemonkey.tests.kotlin import com.navercorp.fixturemonkey.FixtureMonkey +import com.navercorp.fixturemonkey.api.arbitrary.CombinableArbitrary import com.navercorp.fixturemonkey.api.experimental.JavaGetterMethodPropertySelector.javaGetter import com.navercorp.fixturemonkey.api.experimental.TypedExpressionGenerator.typedRoot +import com.navercorp.fixturemonkey.api.introspector.ArbitraryIntrospectorResult import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector import com.navercorp.fixturemonkey.api.introspector.FactoryMethodArbitraryIntrospector import com.navercorp.fixturemonkey.api.introspector.FailoverIntrospector +import com.navercorp.fixturemonkey.api.type.Types.GeneratedWildcardType import com.navercorp.fixturemonkey.kotlin.KotlinPlugin import com.navercorp.fixturemonkey.kotlin.get import com.navercorp.fixturemonkey.kotlin.giveMeBuilder @@ -244,6 +247,34 @@ class KotlinTest { then(actual).isBetween(min, max) } + @RepeatedTest(TEST_COUNT) + fun sampleCustomizedWildcardType() { + // given + class MapObject(val map: Map) + + val expected = "test" + + val sut = FixtureMonkey.builder() + .plugin(KotlinPlugin()) + .pushExactTypeArbitraryIntrospector { + ArbitraryIntrospectorResult( + CombinableArbitrary.from(expected) + ) + } + .build() + + // when + val actual = sut.giveMeBuilder() + .sizeExp(MapObject::map, 1) + .sample() + .map + .values + .first() + + // then + then(actual).isEqualTo(expected) + } + companion object { private val SUT: FixtureMonkey = FixtureMonkey.builder() .plugin(KotlinPlugin())