package com.netflix.governator;
import com.google.inject.AbstractModule;
import com.google.inject.spi.Element;
import com.netflix.governator.visitors.BindingTracingVisitor;
import com.netflix.governator.visitors.KeyTracingVisitor;
import com.netflix.governator.visitors.ModuleSourceTracingVisitor;
import com.netflix.governator.visitors.WarnOfToInstanceInjectionVisitor;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.mockito.Mockito;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import javax.inject.Inject;
public class InjectorBuilderTest {
@Test
public void testLifecycleInjectorEvents() {
final AtomicBoolean injectCalled = new AtomicBoolean(false);
final AtomicBoolean afterInjectorCalled = new AtomicBoolean(false);
InjectorBuilder
.fromModule(new AbstractModule() {
@Override
protected void configure() {
}
})
.createInjector(new LifecycleInjectorCreator() {
@Inject
public void initialize() {
injectCalled.set(true);
}
@Override
protected void onCompletedInjectorCreate() {
afterInjectorCalled.set(true);
}
})
.shutdown();
Assert.assertTrue(injectCalled.get());
Assert.assertTrue(afterInjectorCalled.get());
}
@Before
public void printTestHeader() {
System.out.println("\n=======================================================");
System.out.println(" Running Test : " + name.getMethodName());
System.out.println("=======================================================\n");
}
@Rule
public TestName name = new TestName();
@Test
public void testBindingTracing() {
InjectorBuilder
.fromModule(new AbstractModule() {
@Override
protected void configure() {
bind(String.class).toInstance("Hello world");
}
})
.traceEachElement(new BindingTracingVisitor())
.createInjector();
}
@Test
public void testForEachBinding() {
Consumer<String> consumer = Mockito.mock(Consumer.class);
InjectorBuilder
.fromModule(new AbstractModule() {
@Override
protected void configure() {
bind(String.class).toInstance("Hello world");
}
})
.forEachElement(new WarnOfToInstanceInjectionVisitor(), consumer)
.createInjector();
Mockito.verify(consumer, Mockito.times(1)).accept(Mockito.anyString());
}
@Test
public void testKeyTracing() {
try (LifecycleInjector li = InjectorBuilder
.fromModule(new AbstractModule() {
@Override
protected void configure() {
bind(String.class).toInstance("Hello world");
}
})
.traceEachElement(new KeyTracingVisitor())
.createInjector()) {}
}
@Test
public void testWarnOnStaticInjection() {
List<Element> elements = InjectorBuilder
.fromModule(new AbstractModule() {
@Override
protected void configure() {
this.requestStaticInjection(String.class);
}
})
.warnOfStaticInjections()
.getElements();
Assert.assertEquals(1, elements.size());
}
@Test
public void testStripStaticInjection() {
List<Element> elements = InjectorBuilder
.fromModule(new AbstractModule() {
@Override
protected void configure() {
this.requestStaticInjection(String.class);
}
})
.stripStaticInjections()
.warnOfStaticInjections()
.getElements();
Assert.assertEquals(0, elements.size());
}
public static class ModuleA extends AbstractModule {
@Override
protected void configure() {
install(new ModuleB());
install(new ModuleC());
}
}
public static class ModuleB extends AbstractModule {
@Override
protected void configure() {
install(new ModuleC());
}
}
public static class ModuleC extends AbstractModule {
@Override
protected void configure() {
bind(String.class).toInstance("Hello world");
}
@Override
public int hashCode() {
return ModuleC.class.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj.getClass().equals(getClass());
}
}
@Test
public void testTraceModules() {
InjectorBuilder
.fromModule(new ModuleA())
.traceEachElement(new ModuleSourceTracingVisitor())
.createInjector();
}
}