diff --git a/src/main/java/com/github/nylle/javafixture/instantiation/BuilderInstantiator.java b/src/main/java/com/github/nylle/javafixture/instantiation/BuilderInstantiator.java index 111142b..c1f811a 100644 --- a/src/main/java/com/github/nylle/javafixture/instantiation/BuilderInstantiator.java +++ b/src/main/java/com/github/nylle/javafixture/instantiation/BuilderInstantiator.java @@ -8,8 +8,11 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.function.BiFunction; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; @@ -30,6 +33,13 @@ public static BuilderInstantiator create(Method builderMethodCandidate, S .orElse(null); } + private Map presetValues = new HashMap<>(); + + public BuilderInstantiator with(BiFunction setter, V value) { + presetValues.put(setter, value); + return this; + } + public T invoke(SpecimenFactory specimenFactory, CustomizationContext customizationContext) { try { var builder = builderMethod.invoke(null, new Object[]{}); @@ -41,6 +51,8 @@ public T invoke(SpecimenFactory specimenFactory, CustomizationContext customizat .create(customizationContext, new Annotation[0]) }); } + // since we are using lambdas, the method name is not available here anymore + presetValues.entrySet().forEach(e -> e.getKey().apply(builder, e.getValue())); return (T) buildMethod.invoke(builder, new Object[]{}); } catch (InvocationTargetException | IllegalAccessException ex) { diff --git a/src/test/java/com/github/nylle/javafixture/instantiation/BuilderInstantiatorTest.java b/src/test/java/com/github/nylle/javafixture/instantiation/BuilderInstantiatorTest.java index 5472fa3..d87d822 100644 --- a/src/test/java/com/github/nylle/javafixture/instantiation/BuilderInstantiatorTest.java +++ b/src/test/java/com/github/nylle/javafixture/instantiation/BuilderInstantiatorTest.java @@ -26,4 +26,23 @@ void invokeReturnsBuiltObjectWithAllMethodsCalled() throws NoSuchMethodException assertThat(actual.getString()).isNotNull(); } + @Test + void builderCanBeCnfigured() throws NoSuchMethodException { + var sut = BuilderInstantiator.create(ClassWithBuilder.class.getMethod("builder"), SpecimenType.fromClass(ClassWithBuilder.class)); + + // we seem to need to explicitly cast it like this. + var result = sut + .with(ClassWithBuilder.Builder::number, 2) + .with(ClassWithBuilder.Builder::string, null) // we have lambdas, i.e. no method names, so no without + .invoke(new SpecimenFactory(new Context(new Configuration())), CustomizationContext.noContext()); + + assertThat(result).isInstanceOf(ClassWithBuilder.class); + + + var actual = (ClassWithBuilder) result; + + assertThat(actual.getNumber()).isEqualTo(2); + assertThat(actual.getString()).isNull(); + } + }