diff --git a/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomBuilder.java b/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomBuilder.java index 188b09bfa..cbb5d702a 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomBuilder.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomBuilder.java @@ -31,6 +31,7 @@ import io.github.benas.randombeans.randomizers.registry.CustomRandomizerRegistry; import java.util.*; +import java.util.function.Supplier; import static io.github.benas.randombeans.util.Constants.DEFAULT_SEED; @@ -77,6 +78,18 @@ public EnhancedRandomBuilder randomize(FieldDefinition fieldDefi return this; } + /** + * Register a {@code Supplier} of custom {@link Randomizer}s for a given field. + * + * @param fieldDefinition definition of the field to randomize + * @param randomizerSupplier the custom Supplier of {@link Randomizer}s to use + * @return a pre configured {@link EnhancedRandomBuilder} instance + */ + public EnhancedRandomBuilder randomize(FieldDefinition fieldDefinition, Supplier> randomizerSupplier) { + customRandomizerRegistry.registerRandomizerSupplier(fieldDefinition.getName(), fieldDefinition.getType(), fieldDefinition.getClazz(), randomizerSupplier); + return this; + } + /** * Exclude a field from being populated. * diff --git a/random-beans/src/main/java/io/github/benas/randombeans/randomizers/registry/CustomRandomizerRegistry.java b/random-beans/src/main/java/io/github/benas/randombeans/randomizers/registry/CustomRandomizerRegistry.java index 9db48afd3..8d9b166b1 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/randomizers/registry/CustomRandomizerRegistry.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/randomizers/registry/CustomRandomizerRegistry.java @@ -32,6 +32,7 @@ import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; /** * Registry of user defined randomizers. @@ -42,6 +43,7 @@ public class CustomRandomizerRegistry implements RandomizerRegistry { private Map, Randomizer> customRandomizersRegistry = new HashMap<>(); + private Map, Supplier> customRandomizersSupplierRegistry = new HashMap<>(); /** * Set the initial seed for all randomizers of the registry @@ -55,7 +57,13 @@ public void setSeed(long seed) { @Override public Randomizer getRandomizer(Field field) { - return customRandomizersRegistry.get(new FieldDefinition<>(field.getName(), field.getType(), field.getDeclaringClass())); + FieldDefinition fieldDefinition = new FieldDefinition<>(field.getName(), field.getType(), field.getDeclaringClass()); + @SuppressWarnings("unchecked") + Supplier> randomizerSupplier = (Supplier>) customRandomizersSupplierRegistry.get(fieldDefinition); + if (randomizerSupplier != null) { + return randomizerSupplier.get(); + } + return customRandomizersRegistry.get(fieldDefinition); } @Override @@ -67,4 +75,8 @@ public void registerRandomizer(final String fieldName, final Class customRandomizersRegistry.put(new FieldDefinition<>(fieldName, fieldType, type), randomizer); } + public void registerRandomizerSupplier(final String fieldName, final Class fieldType, final Class type, final Supplier> randomizerSupplier) { + customRandomizersSupplierRegistry.put(new FieldDefinition<>(fieldName, fieldType, type), randomizerSupplier); + } + } diff --git a/random-beans/src/test/java/io/github/benas/randombeans/EnhancedRandomImplTest.java b/random-beans/src/test/java/io/github/benas/randombeans/EnhancedRandomImplTest.java index dd1c6acbb..431eb7852 100644 --- a/random-beans/src/test/java/io/github/benas/randombeans/EnhancedRandomImplTest.java +++ b/random-beans/src/test/java/io/github/benas/randombeans/EnhancedRandomImplTest.java @@ -28,6 +28,8 @@ import io.github.benas.randombeans.api.ObjectGenerationException; import io.github.benas.randombeans.api.Randomizer; import io.github.benas.randombeans.beans.*; +import io.github.benas.randombeans.randomizers.ConstantRandomizer; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,6 +38,7 @@ import java.util.Date; import java.util.List; +import java.util.function.Supplier; import static io.github.benas.randombeans.EnhancedRandomBuilder.aNewEnhancedRandomBuilder; import static io.github.benas.randombeans.FieldDefinitionBuilder.field; @@ -132,6 +135,49 @@ public void generatedBeansWithCustomRandomizersShouldBeCorrectlyPopulated() { assertThat(person.getName()).isEqualTo(NAME); } + @Test + public void generatedBeansWithCustomRandomizerSupplierShouldBeCorrectlyPopulated() { + FieldDefinition nameFieldDefinition = field().named("name").ofType(String.class).inClass(Human.class).get(); + enhancedRandom = aNewEnhancedRandomBuilder().randomize(nameFieldDefinition, new Supplier>() { + private boolean firstCall = true; + + public Randomizer get() { + if (firstCall) { + firstCall = false; + return new ConstantRandomizer(NAME); + } + return new ConstantRandomizer(NAME + NAME); + } + }).build(); + + Human firstHuman = enhancedRandom.nextObject(Human.class); + + assertThat(firstHuman).isNotNull(); + assertThat(firstHuman.getName()).isEqualTo(NAME); + + Person secondHuman = enhancedRandom.nextObject(Person.class); + + assertThat(secondHuman).isNotNull(); + assertThat(secondHuman.getName()).isEqualTo(NAME + NAME); + } + + @Test + public void customRandomizerSupplierShouldHavePrecedenceOverCustomRandomizer() { + FieldDefinition nameFieldDefinition = field().named("name").ofType(String.class).inClass(Human.class).get(); + enhancedRandom = aNewEnhancedRandomBuilder() + .randomize(nameFieldDefinition, new Supplier>() { + public Randomizer get() { + return new ConstantRandomizer(NAME); + } + }) + .randomize(nameFieldDefinition, new ConstantRandomizer("abc")).build(); + + Human firstHuman = enhancedRandom.nextObject(Human.class); + + assertThat(firstHuman).isNotNull(); + assertThat(firstHuman.getName()).isEqualTo(NAME); + } + @Test public void javaNetTypesShouldBePopulated() {