com.github.nylle.javafixture.specimen.GenericSpecimen Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of javafixture Show documentation
Show all versions of javafixture Show documentation
JavaFixture is the attempt to bring Mark Seemann's AutoFixture for .NET to the Java world. Its purpose
is to generate full object graphs for use in test suites with a fluent API for customising the test objects
during generation.
package com.github.nylle.javafixture.specimen;
import com.github.nylle.javafixture.Context;
import com.github.nylle.javafixture.CustomizationContext;
import com.github.nylle.javafixture.ISpecimen;
import com.github.nylle.javafixture.InstanceFactory;
import com.github.nylle.javafixture.ReflectionHelper;
import com.github.nylle.javafixture.SpecimenFactory;
import com.github.nylle.javafixture.SpecimenType;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.stream.IntStream;
import static com.github.nylle.javafixture.CustomizationContext.noContext;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toMap;
public class GenericSpecimen implements ISpecimen {
private final SpecimenType type;
private final Context context;
private final SpecimenFactory specimenFactory;
private final InstanceFactory instanceFactory;
private final Map> specimens;
public GenericSpecimen(final SpecimenType type, final Context context, final SpecimenFactory specimenFactory) throws IllegalArgumentException {
if (type == null) {
throw new IllegalArgumentException("type: null");
}
if (context == null) {
throw new IllegalArgumentException("context: null");
}
if (specimenFactory == null) {
throw new IllegalArgumentException("specimenFactory: null");
}
if (!type.isParameterized()) {
throw new IllegalArgumentException("type: " + type.getName());
}
if (type.isCollection() || type.isMap()) {
throw new IllegalArgumentException("type: " + type.getName());
}
this.type = type;
this.context = context;
this.specimenFactory = specimenFactory;
this.instanceFactory = new InstanceFactory(specimenFactory);
this.specimens = IntStream.range(0, type.getGenericTypeArguments().length)
.boxed()
.collect(toMap(
i -> type.getTypeParameterName(i),
i -> specimenFactory.build(SpecimenType.fromClass(type.getGenericTypeArgument(i)))));
}
@Override
public T create() {
return create(noContext());
}
@Override
public T create(final CustomizationContext customizationContext) {
if (type.asClass().equals(Class.class)) {
return (T) specimens.entrySet().stream().findFirst().get().getValue().create().getClass();
}
if (context.isCached(type)) {
return (T) context.cached(type);
}
if (type.isInterface()) {
return (T) context.cached(type, instanceFactory.proxy(type, specimens));
}
if (customizationContext.useRandomConstructor()) {
return context.cached(type, instanceFactory.construct(type));
}
var result = context.cached(type, instanceFactory.instantiate(type));
stream(type.asClass().getDeclaredFields())
.filter(x -> !customizationContext.getIgnoredFields().contains(x.getName()))
.filter(field -> !ReflectionHelper.isStatic(field))
.forEach(field -> customize(field, result, customizationContext));
return result;
}
private void customize(Field field, T result, CustomizationContext customizationContext) {
if (customizationContext.getCustomFields().containsKey(field.getName())) {
ReflectionHelper.setField(field, result, customizationContext.getCustomFields().get(field.getName()));
} else {
ReflectionHelper.setField(field, result, specimens.getOrDefault(field.getGenericType().getTypeName(), specimenFactory.build(SpecimenType.fromClass(field.getType()))).create());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy