package org.sdif4j.testing.cdi; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.sdif4j.InjectContext; import org.sdif4j.cdi.CdiInjectContext; import org.sdif4j.testing.TestEagerSingleton; import org.sdif4j.testing.TestLazySingleton; import org.sdif4j.testing.TestPrototype; import org.sdif4j.testing.TestSingleton; import org.testng.Assert; import org.testng.annotations.Test; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.inject.Named; /** * Simple CDI tests for {@link org.sdif4j.cdi.CdiInjectContext} inside {@code Arquillian} container. * * @author Pavel Shackih */ public class ArquillianTest extends Arquillian { static final String FOO_BEAN = "fooBean"; @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) // we need to build our own jar for container .addPackage("org.sdif4j.cdi") .addClass(InjectContext.class) .addPackage("org.sdif4j.testing") .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject InjectContext injectContext; @Test public void testInjectContextInstance() { final InjectContext injectContext = this.injectContext; Assert.assertTrue(injectContext instanceof CdiInjectContext); Assert.assertTrue(this.injectContext.getInstance(InjectContext.class) == injectContext); } @Test public void testNamedService() { IService service = injectContext.getInstance(IService.class, FOO_BEAN); Assert.assertNotNull(service); Assert.assertTrue("foo".equals(service.foo())); } @Test public void testNamedString() { Assert.assertEquals(injectContext.getInstance(String.class, "key"), "value"); } @Test public void testSingleton() { Assert.assertEquals(TestEagerSingleton.getInstantCount(), 0); final TestSingleton testSingleton1 = injectContext.getInstance(TestSingleton.class); final TestSingleton testSingleton2 = injectContext.getInstance(TestSingleton.class); final TestEagerSingleton testEagerSingleton1 = injectContext.getInstance(TestEagerSingleton.class); final TestEagerSingleton testEagerSingleton2 = injectContext.getInstance(TestEagerSingleton.class); Assert.assertEquals(TestEagerSingleton.getInstantCount(), 1); Assert.assertNotNull(testSingleton1); Assert.assertTrue(testSingleton1 == testSingleton2); Assert.assertTrue(testSingleton2 == testEagerSingleton1); Assert.assertTrue(testEagerSingleton1 == testEagerSingleton2); } @Test public void testLazySingleton() { Assert.assertEquals(TestLazySingleton.getInstantCount(), 0); final TestLazySingleton s1 = injectContext.getInstance(TestLazySingleton.class); final TestLazySingleton s2 = injectContext.getInstance(TestLazySingleton.class); Assert.assertEquals(TestLazySingleton.getInstantCount(), 1); Assert.assertNotNull(s1); Assert.assertTrue(s1 == s2); } @Test public void testPrototype() { final TestPrototype testPrototype1 = injectContext.getInstance(TestPrototype.class); final TestPrototype testPrototype2 = injectContext.getInstance(TestPrototype.class); Assert.assertNotNull(testPrototype1); Assert.assertNotNull(testPrototype2); Assert.assertTrue(testPrototype1 != testPrototype2); } @Test public void testInjectMembers() { class TestInjectable { @Inject @Named("key") String testKey; } final TestInjectable testInjectable = new TestInjectable(); injectContext.injectMembers(testInjectable); Assert.assertEquals(testInjectable.testKey, "value"); } interface IService { String foo(); } @Named(FOO_BEAN) @SuppressWarnings("unused") static class IServiceImpl implements IService { public String foo() { return "foo"; } } @Produces @Named("key") @SuppressWarnings("unused") String keyProduce() { return "value"; } }