package org.testory.plumbing.inject; import static java.lang.reflect.Modifier.isFinal; import static java.lang.reflect.Modifier.isStatic; import static java.util.Objects.deepEquals; import static org.testory.common.Classes.defaultValue; import static org.testory.common.Classes.setAccessible; import static org.testory.plumbing.PlumbingException.check; import java.lang.reflect.Field; import org.testory.plumbing.Maker; public class Injector { private final Maker maker; public Injector(Maker maker) { check(maker != null); this.maker = maker; } public void inject(Object test) { check(test != null); try { for (Field field : test.getClass().getDeclaredFields()) { if (!isStatic(field.getModifiers()) && !isFinal(field.getModifiers())) { setAccessible(field); if (deepEquals(defaultValue(field.getType()), field.get(test))) { field.set(test, maker.make(field.getType(), field.getName())); } } } } catch (IllegalAccessException e) { throw new Error(e); } } }