package org.ovirt.engine.core.di; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import java.lang.annotation.Annotation; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.enterprise.inject.Instance; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.CDI; import javax.enterprise.util.TypeLiteral; import org.junit.rules.TestWatcher; import org.junit.runner.Description; public class InjectorRule extends TestWatcher { private static final Map<Class<?>, Object> beansCache = new ConcurrentHashMap<>(); static { CDI.setCDIProvider(TestCDIProvider::new); } @Override protected void finished(Description description) { super.finished(description); beansCache.clear(); } public <T> void bind(Class<T> pureClsType, T instance) { beansCache.put(pureClsType, instance); } private static class TestCDIProvider<T> extends CDI<T> { @Override public BeanManager getBeanManager() { return mock(BeanManager.class, RETURNS_DEEP_STUBS); } @Override public Instance<T> select(Annotation... var1) { return null; } @Override public <U extends T> Instance<U> select(TypeLiteral<U> typeLiteral, Annotation... annotations) { return null; } @Override public boolean isUnsatisfied() { return false; } @Override public boolean isAmbiguous() { return false; } @Override public void destroy(T t) { } @Override @SuppressWarnings("unchecked") public <U extends T> Instance<U> select(Class<U> aClass, Annotation... annotations) { return new SimpleInstanceIdGenerator<>((U) beansCache.get(aClass)); } @Override public Iterator<T> iterator() { return null; } @Override public T get() { return null; } } private static class SimpleInstanceIdGenerator<T> implements Instance<T> { private final T value; public SimpleInstanceIdGenerator(T value) { this.value = value; } @Override public T get() { return value; } @Override public Instance<T> select(Annotation... annotations) { return null; } @Override public <U extends T> Instance<U> select(Class<U> aClass, Annotation... annotations) { return null; } @Override public <U extends T> Instance<U> select(TypeLiteral<U> typeLiteral, Annotation... annotations) { return null; } @Override public boolean isUnsatisfied() { return false; } @Override public boolean isAmbiguous() { return false; } @Override public void destroy(T u) { } @Override public Iterator<T> iterator() { return null; } } }