package core.framework.test.inject;
import core.framework.api.util.Exceptions;
import core.framework.api.util.Sets;
import core.framework.impl.inject.BeanFactory;
import core.framework.impl.inject.Key;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Type;
import java.util.Set;
/**
* @author neo
*/
public final class TestBeanFactory extends BeanFactory {
private final Logger logger = LoggerFactory.getLogger(TestBeanFactory.class);
private final Set<Key> overrideBindings = Sets.newHashSet();
private final Set<Key> skippedBindings = Sets.newHashSet(); // track overridden beans to detect duplicate binding
@Override
public void bind(Type type, String name, Object instance) {
Key key = new Key(type, name);
if (overrideBindings.contains(key)) {
if (skippedBindings.contains(key)) throw Exceptions.error("found duplicate bean, type={}, name={}", type.getTypeName(), name);
skippedBindings.add(key);
logger.info("skip bean binding, bean is overridden in test context, type={}, name={}", type.getTypeName(), name);
} else {
super.bind(type, name, instance);
}
}
public <T> T overrideBinding(Type type, String name, T instance) {
bind(type, name, instance);
overrideBindings.add(new Key(type, name));
return instance;
}
}