package com.netflix.governator;
import com.google.inject.AbstractModule;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.matcher.Matchers;
import com.google.inject.spi.ProvisionListener;
import com.netflix.governator.package1.AutoBindSingletonConcrete;
import com.netflix.governator.package1.AutoBindSingletonInterface;
import com.netflix.governator.package1.AutoBindSingletonMultiBinding;
import com.netflix.governator.package1.AutoBindSingletonWithInterface;
import com.netflix.governator.package1.FooModule;
import org.junit.Assert;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
public class AutoBindSingletonTest {
@Test
public void confirmBindingsCreatedForAutoBindSinglton() {
final Set<Class> created = new HashSet<>();
try (LifecycleInjector injector = InjectorBuilder.fromModules(
new ScanningModuleBuilder()
.forPackages("com.netflix.governator.package1", "com.netflix")
.addScanner(new AutoBindSingletonAnnotatedClassScanner())
.build(),
new AbstractModule() {
@Override
protected void configure() {
bindListener(Matchers.any(), new ProvisionListener() {
@Override
public <T> void onProvision(ProvisionInvocation<T> provision) {
Class<?> type = provision.getBinding().getKey().getTypeLiteral().getRawType();
if (type != null && type.getName().startsWith("com.netflix.governator.package1")) {
created.add(type);
}
}
});
}
})
.createInjector()) {
Assert.assertTrue(created.contains(AutoBindSingletonConcrete.class));
injector.getInstance(Key.get(new TypeLiteral<Set<AutoBindSingletonInterface>>() {}));
injector.getInstance(Key.get(AutoBindSingletonInterface.class));
Assert.assertTrue(created.contains(AutoBindSingletonMultiBinding.class));
Assert.assertTrue(created.contains(AutoBindSingletonWithInterface.class));
Assert.assertEquals(injector.getInstance(String.class), "AutoBound");
}
}
@Test
public void confirmNoBindingsForExcludedClass() {
try (LifecycleInjector injector = InjectorBuilder.fromModules(
new ScanningModuleBuilder()
.forPackages("com.netflix.governator.package1")
.addScanner(new AutoBindSingletonAnnotatedClassScanner())
.excludeClasses(AutoBindSingletonConcrete.class)
.build())
.createInjector()) {
Assert.assertNull(injector.getExistingBinding(Key.get(AutoBindSingletonConcrete.class)));
}
}
@Test
public void confirmModuleDedupingWorksWithScannedClasse() {
try (LifecycleInjector injector = InjectorBuilder.fromModules(
new ScanningModuleBuilder()
.forPackages("com.netflix.governator.package1")
.addScanner(new AutoBindSingletonAnnotatedClassScanner())
.excludeClasses(AutoBindSingletonConcrete.class)
.build(),
new FooModule()
)
.createInjector()) {
Assert.assertNull(injector.getExistingBinding(Key.get(AutoBindSingletonConcrete.class)));
}
}
}