/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.engine.inject; import java.util.Map; import javax.inject.Inject; import org.junit.Assert; import org.junit.Test; import com.google.common.collect.Maps; public class InjectorTest { private Map<Class<?>, Object> createRegistry(Object... args) { Map<Class<?>, Object> registry = Maps.newHashMap(); for (Object arg : args) { registry.put(arg.getClass(), arg); } return registry; } private Map<Class<?>, Object> createSingleRegistry(Class<?> clazz, Object value) { Map<Class<?>, Object> registry = Maps.newHashMap(); registry.put(clazz, value); return registry; } private <T> T inject(T target, Map<Class<?>, Object> data) { Injector.inject(target, data); return target; } @Test public void testSimpleInject() { Map<Class<?>, Object> registry = createRegistry(new Foo(), new FooBar()); UseFoo useFoo = inject(new UseFoo(), registry); Assert.assertNotNull(useFoo.foo); Assert.assertEquals(useFoo.foo, registry.get(Foo.class)); UseFooBar useFooBar = inject(new UseFooBar(), registry); Assert.assertNotNull(useFooBar.foobar); Assert.assertEquals(useFooBar.foobar, registry.get(FooBar.class)); } @Test public void testInheritedInject() { Map<Class<?>, Object> registry = createRegistry(new Foo(), new FooBar()); UseFooAndFooBar useFooAndFooBar = inject(new UseFooAndFooBar(), registry); Assert.assertNotNull(useFooAndFooBar.foo); Assert.assertEquals(useFooAndFooBar.foo, registry.get(Foo.class)); Assert.assertNotNull(useFooAndFooBar.foobar); Assert.assertEquals(useFooAndFooBar.foobar, registry.get(FooBar.class)); UseFooBarAndFoo useFooBarAndFoo = inject(new UseFooBarAndFoo(), registry); Assert.assertNotNull(useFooBarAndFoo.foo); Assert.assertEquals(useFooBarAndFoo.foo, registry.get(Foo.class)); Assert.assertNotNull(useFooBarAndFoo.foobar); Assert.assertEquals(useFooAndFooBar.foobar, registry.get(FooBar.class)); } @Test public void testInjectByDeclaredType() { UseFoo foo = inject(new UseFoo(), createSingleRegistry(Foo.class, new FooBar())); Assert.assertEquals(foo.foo.getClass(), FooBar.class); UseFoo otherFoo = inject(new UseFoo(), createSingleRegistry(Foo.class, new Object())); Assert.assertNull(otherFoo.foo); } public static class Foo { } public static class FooBar extends Foo { } public static class UseFoo { @Inject protected Foo foo; } public static class UseFooBar { @Inject protected FooBar foobar; } public static class UseFooAndFooBar extends UseFoo { @Inject protected FooBar foobar; } public static class UseFooBarAndFoo extends UseFooBar { @Inject protected Foo foo; } }