/*************************************************************************** * Copyright 2009-2012 by Christian Ihle * * kontakt@usikkert.net * * * * This file is part of KouInject. * * * * KouInject is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation, either version 3 of * * the License, or (at your option) any later version. * * * * KouInject is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with KouInject. * * If not, see <http://www.gnu.org/licenses/>. * ***************************************************************************/ package net.usikkert.kouinject; import static net.usikkert.kouinject.testbeans.scanned.profile.Profiles.*; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import java.util.List; import net.usikkert.kouinject.generics.TypeLiteral; import net.usikkert.kouinject.testbeans.BeanCount; import net.usikkert.kouinject.testbeans.notscanned.TheInterfaceUser; import net.usikkert.kouinject.testbeans.scanned.HelloBean; import net.usikkert.kouinject.testbeans.scanned.collection.HungryBean; import net.usikkert.kouinject.testbeans.scanned.factory.SimpleFactoryCreatedBean; import net.usikkert.kouinject.testbeans.scanned.generics.qualifier.Dao; import net.usikkert.kouinject.testbeans.scanned.generics.qualifier.ItemDaoBean; import net.usikkert.kouinject.testbeans.scanned.generics.qualifier.MySqlDriver; import net.usikkert.kouinject.testbeans.scanned.generics.qualifier.OrderDaoBean; import net.usikkert.kouinject.testbeans.scanned.generics.qualifier.PersonDaoBean; import net.usikkert.kouinject.testbeans.scanned.generics.stuff.OneStuffBean; import net.usikkert.kouinject.testbeans.scanned.profile.ProfileABean; import net.usikkert.kouinject.testbeans.scanned.profile.ProfileACBean; import net.usikkert.kouinject.testbeans.scanned.qualifier.BlueBean; import net.usikkert.kouinject.testbeans.scanned.qualifier.ColorBean; import net.usikkert.kouinject.testbeans.scanned.qualifier.RedBean; import org.junit.Before; import org.junit.Test; /** * Test of {@link DefaultInjector}. * * <p>These tests are just to verify that the injector works. More thorough tests * are done elsewhere.</p> * * @author Christian Ihle */ public class DefaultInjectorTest { private DefaultInjector injector; @Before public void createInjector() { injector = new DefaultInjector("net.usikkert.kouinject.testbeans.scanned"); } @Test public void getBeanShouldFindBeanAvailableInTheBasePackage() { final HelloBean helloBean = injector.getBean(HelloBean.class); assertNotNull(helloBean); } @Test(expected = IllegalArgumentException.class) public void getBeanShouldThrowExceptionIfRequestedBeanIsUnavailableInTheBasePackage() { injector.getBean(TheInterfaceUser.class); } @Test public void getBeanWithQualifierShouldFindCorrectBean() { final ColorBean colorBean = injector.getBean(ColorBean.class, "red"); assertNotNull(colorBean); assertEquals(RedBean.class, colorBean.getClass()); } @Test public void getBeansWithoutQualifierShouldFindBeansWithoutQualifier() { final Collection<Object> beans = injector.getBeans(Object.class); assertNotNull(beans); assertEquals(BeanCount.SCANNED_WITHOUT_QUALIFIER.getNumberOfBeans(), beans.size()); } @Test public void getBeansWithAnyQualifierShouldFindAllBeans() { final Collection<Object> beans = injector.getBeans(Object.class, "any"); assertNotNull(beans); assertEquals(BeanCount.SCANNED.getNumberOfBeans(), beans.size()); } @Test public void injectorShouldSupportLoadingBeansFromMultipleBasePackages() { final Injector newInjector = new DefaultInjector( "net.usikkert.kouinject.testbeans.scanned.qualifier", "net.usikkert.kouinject.testbeans.scanned.collection"); assertNotNull(newInjector.getBean(BlueBean.class)); assertNotNull(newInjector.getBean(HungryBean.class)); try { newInjector.getBean(HelloBean.class); fail("Should not get an instance of a bean class not scanned"); } catch (IllegalArgumentException e) { // ok } } @Test public void getBeanShouldFindFactoryCreatedBean() { final SimpleFactoryCreatedBean bean = injector.getBean(SimpleFactoryCreatedBean.class); assertNotNull(bean); assertTrue(bean.isCreatedByFactory()); } @Test public void getBeanShouldFindGenericBean() { final List<OneStuffBean> bean = injector.getBean(new TypeLiteral<List<OneStuffBean>>() {}); assertNotNull(bean); assertEquals(1, bean.size()); final OneStuffBean oneStuffBean = bean.get(0); assertNotNull(oneStuffBean); } @Test public void getBeanShouldFindGenericBeanWithQualifier() { final Dao<MySqlDriver> bean = injector.getBean(new TypeLiteral<Dao<MySqlDriver>>() {}, "item"); assertNotNull(bean); assertEquals(ItemDaoBean.class, bean.getClass()); } @Test public void getBeansShouldFindGenericBean() { final Collection<List<OneStuffBean>> beans = injector.getBeans(new TypeLiteral<List<OneStuffBean>>() {}); assertNotNull(beans); assertEquals(1, beans.size()); final List<OneStuffBean> oneStuffBeans = beans.iterator().next(); assertNotNull(oneStuffBeans); assertEquals(1, oneStuffBeans.size()); final OneStuffBean oneStuffBean = oneStuffBeans.get(0); assertNotNull(oneStuffBean); } @Test public void getBeansShouldFindGenericBeansWithQualifier() { final Collection<Dao<MySqlDriver>> beans = injector.getBeans(new TypeLiteral<Dao<MySqlDriver>>() {}, "any"); assertNotNull(beans); assertEquals(3, beans.size()); assertTrue(containsBean(beans, ItemDaoBean.class)); assertTrue(containsBean(beans, PersonDaoBean.class)); assertTrue(containsBean(beans, OrderDaoBean.class)); } @Test(expected = IllegalArgumentException.class) public void getBeanShouldFailToGetProfiledBeanWhenNoProfilesActive() { injector.getBean(ProfileABean.class); } @Test(expected = IllegalArgumentException.class) public void getBeanShouldFailToGetProfiledBeanWhenDifferentProfileIsActive() { injector = new DefaultInjector(Arrays.asList(PROFILE_B.value()), "net.usikkert.kouinject.testbeans.scanned"); injector.getBean(ProfileABean.class); } @Test public void getBeanShouldFindBeansWithActiveProfile() { injector = new DefaultInjector(Arrays.asList(PROFILE_A.value()), "net.usikkert.kouinject.testbeans.scanned"); final ProfileABean profileABean = injector.getBean(ProfileABean.class); assertNotNull(profileABean); final ProfileACBean profileACBean = injector.getBean(ProfileACBean.class); assertNotNull(profileACBean); } @Test public void getBeansShouldFindBeansWithActiveProfile() { injector = new DefaultInjector(Arrays.asList(PROFILE_A.value(), PROFILE_B.value(), PROFILE_C.value(), PRODUCTION.value(), IN_MEMORY.value(), SWING.value()), "net.usikkert.kouinject.testbeans.scanned"); final Collection<Object> beans = injector.getBeans(Object.class, "any"); assertNotNull(beans); assertEquals(BeanCount.SCANNED_WITH_PROFILED.getNumberOfBeans(), beans.size()); } private boolean containsBean(final Collection<?> collection, final Class<?> beanClass) { for (final Object object : collection) { if (object.getClass().equals(beanClass)) { return true; } } return false; } }