package net.sourceforge.stripes.integration.spring; import javax.servlet.ServletContext; import net.sourceforge.stripes.StripesTestFixture; import net.sourceforge.stripes.config.Configuration; import net.sourceforge.stripes.controller.DefaultObjectFactory; import net.sourceforge.stripes.exception.StripesRuntimeException; import net.sourceforge.stripes.test.TestActionBean; import net.sourceforge.stripes.test.TestBean; import org.springframework.context.support.StaticApplicationContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.StaticWebApplicationContext; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * Unit tests for the SpringHelper class that injects spring managed beans * into objects. * * @author Tim Fennell */ public class SpringHelperTests { StaticApplicationContext ctx; @BeforeClass(alwaysRun=true) protected void setupSpringContext() { ctx = new StaticWebApplicationContext(); ctx.registerSingleton("test/TestBean", TestBean.class); ctx.registerSingleton("testActionBean", TestActionBean.class); ctx.registerPrototype("test/testActionBean", TestActionBean.class); } /////////////////////////////////////////////////////////////////////////// private static class ExplicitPublicSetterTarget { private TestBean bean; @SuppressWarnings("unused") @SpringBean("test/TestBean") public void setBean(TestBean bean) { this.bean = bean; } public TestBean getBean() { return bean; } } @Test(groups="fast") public void testExplicitSetterInjection() { ExplicitPublicSetterTarget target = new ExplicitPublicSetterTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ExplicitPrivateSetterTarget { private TestBean bean; @SuppressWarnings("unused") @SpringBean("test/TestBean") private void setBean(TestBean bean) { this.bean = bean; } TestBean getBean() { return bean; } } @Test(groups="fast") public void testPrivateSetterInjection() { ExplicitPrivateSetterTarget target = new ExplicitPrivateSetterTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ExplicitPrivateFieldTarget { @SpringBean("test/TestBean") private TestBean bean; TestBean getBean() { return bean; } } @Test(groups="fast") public void testPrivateFieldInjection() { ExplicitPrivateFieldTarget target = new ExplicitPrivateFieldTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ExplicitNonStandardSetterTarget { private TestBean bean; @SuppressWarnings("unused") @SpringBean("test/TestBean") protected void injectHere(TestBean bean) { this.bean = bean; } TestBean getBean() { return bean; } } @Test(groups="fast") public void testExplicitNonStandardSetterInjection() { ExplicitNonStandardSetterTarget target = new ExplicitNonStandardSetterTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ImplicitNonStandardSetterTarget { private TestActionBean bean; @SuppressWarnings("unused") @SpringBean protected void testActionBean(TestActionBean bean) { this.bean = bean; } TestActionBean getBean() { return bean; } } @Test(groups="fast") public void testImplicitNonStandardSetterInjection() { ImplicitNonStandardSetterTarget target = new ImplicitNonStandardSetterTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ImplicitStandardSetterTarget { private TestActionBean bean; @SuppressWarnings("unused") @SpringBean protected void setTestActionBean(TestActionBean bean) { this.bean = bean; } TestActionBean getBean() { return bean; } } @Test(groups="fast") public void testImplicitStandardSetterInjection() { ImplicitStandardSetterTarget target = new ImplicitStandardSetterTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ImplicitFieldTarget { @SpringBean private TestActionBean testActionBean; TestActionBean getBean() { return testActionBean; } } @Test(groups="fast") public void testImplicitFieldInjection() { ImplicitFieldTarget target = new ImplicitFieldTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class DerivedFromImplicitFieldTarget extends ImplicitFieldTarget { } @Test(groups="fast") public void testDerivedFromImplicitFieldInjection() { DerivedFromImplicitFieldTarget target = new DerivedFromImplicitFieldTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class ByTypeTarget { @SpringBean private TestBean someBeanOrOther; TestBean getBean() { return someBeanOrOther; } } @Test(groups="fast") public void testByTypeInjection() { ByTypeTarget target = new ByTypeTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// private static class MultipleInjectionTarget { @SpringBean TestBean someBeanOrOther; // by type @SpringBean TestActionBean testActionBean; // by field name TestActionBean number3; // explicit private method TestActionBean number4; // explicit public method @SuppressWarnings("unused") @SpringBean("test/testActionBean") private void setNumber3(TestActionBean value) { this.number3 = value; } @SuppressWarnings("unused") @SpringBean("testActionBean") public void whee(TestActionBean value) { this.number4 = value; } } @Test(groups="fast") public void testMultipleInjection() { MultipleInjectionTarget target = new MultipleInjectionTarget(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.someBeanOrOther); Assert.assertNotNull(target.testActionBean); Assert.assertNotNull(target.number3); Assert.assertNotNull(target.number4); } /////////////////////////////////////////////////////////////////////////// private static class AmbiguousByTypeTarget { @SuppressWarnings("unused") @SpringBean TestActionBean someBeanOrOther; } @Test(groups="fast", expectedExceptions=StripesRuntimeException.class) public void testAmbiguousByTypeInjection() { AmbiguousByTypeTarget target = new AmbiguousByTypeTarget(); SpringHelper.injectBeans(target, ctx); } /////////////////////////////////////////////////////////////////////////// private static class ExplicitMisNamedTarget { @SuppressWarnings("unused") @SpringBean("nonExistentBean") TestActionBean someBeanOrOther; } @Test(groups="fast", expectedExceptions=StripesRuntimeException.class) public void testExplicitMisNamedTargetInjection() { ExplicitMisNamedTarget target = new ExplicitMisNamedTarget(); SpringHelper.injectBeans(target, ctx); } /////////////////////////////////////////////////////////////////////////// private static class ImplicitMisNamedTarget { @SuppressWarnings("unused") @SpringBean TestActionBean tstActionBea; } @Test(groups="fast", expectedExceptions=StripesRuntimeException.class) public void testImplicitMisNamedTargetInjection() { ImplicitMisNamedTarget target = new ImplicitMisNamedTarget(); SpringHelper.injectBeans(target, ctx); } /////////////////////////////////////////////////////////////////////////// private static class NoBeanOfTypeTarget { @SuppressWarnings("unused") @SpringBean SpringHelperTests noBeansOfType; } @Test(groups="fast", expectedExceptions=StripesRuntimeException.class) public void testNoBeansOfTargetTypeInjection() { NoBeanOfTypeTarget target = new NoBeanOfTypeTarget(); SpringHelper.injectBeans(target, ctx); } /////////////////////////////////////////////////////////////////////////// private static class InvalidSetterSignatureTarget { @SuppressWarnings("unused") TestActionBean testActionBean; @SuppressWarnings("unused") @SpringBean public void setTestActionBean(TestActionBean bean, TestActionBean other) { this.testActionBean = bean; } } @Test(groups="fast", expectedExceptions=StripesRuntimeException.class) public void testInvalidSetterSignatureInjection() { InvalidSetterSignatureTarget target = new InvalidSetterSignatureTarget(); SpringHelper.injectBeans(target, ctx); } /////////////////////////////////////////////////////////////////////////// private static class MultipleInjectionTarget2 { @SpringBean TestBean someBeanOrOther; // by type @SpringBean TestActionBean testActionBean; // by field name TestActionBean number3; // explicit private method TestActionBean number4; // explicit public method @SuppressWarnings("unused") @SpringBean("test/testActionBean") private void setNumber3(TestActionBean value) { this.number3 = value; } @SuppressWarnings("unused") @SpringBean("testActionBean") public void whee(TestActionBean value) { this.number4 = value; } } @Test(groups="slow", threadPoolSize=10, invocationCount=1000) public void testConcurrentInjection() { MultipleInjectionTarget2 target = new MultipleInjectionTarget2(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.someBeanOrOther); Assert.assertNotNull(target.testActionBean); Assert.assertNotNull(target.number3); Assert.assertNotNull(target.number4); } // ///////////////////////////////////////////////////////////////////////// public static class PostProcessorTarget { private TestBean bean; @SpringBean("test/TestBean") public void setBean(TestBean bean) { this.bean = bean; } public TestBean getBean() { return bean; } } @Test(groups = "fast", dependsOnMethods = "testExplicitSetterInjection") public void testInjectionViaObjectPostProcessor() throws Exception { Configuration configuration = StripesTestFixture.getDefaultConfiguration(); ServletContext sc = configuration.getServletContext(); sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.ctx); DefaultObjectFactory factory = new DefaultObjectFactory(); factory.init(configuration); factory.addPostProcessor(new SpringInjectionPostProcessor()); PostProcessorTarget target = factory.newInstance(PostProcessorTarget.class); Assert.assertNotNull(target.getBean()); } /////////////////////////////////////////////////////////////////////////// public static class HiddenPrivateFieldTarget1 { @SpringBean private TestBean a; @SpringBean TestBean b; @SpringBean protected TestBean c; @SpringBean public TestBean d; public TestBean getA1() { return a; } public TestBean getB1() { return b; } public TestBean getC1() { return c; } public TestBean getD1() { return d; } } public static class HiddenPrivateFieldTarget2 extends HiddenPrivateFieldTarget1 { @SpringBean private TestBean a; @SpringBean TestBean b; @SpringBean protected TestBean c; @SpringBean public TestBean d; public TestBean getA2() { return a; } public TestBean getB2() { return b; } public TestBean getC2() { return c; } public TestBean getD2() { return d; } } @Test(groups = "fast") public void testHiddenFields() { HiddenPrivateFieldTarget2 target = new HiddenPrivateFieldTarget2(); SpringHelper.injectBeans(target, ctx); Assert.assertNotNull(target.getA1()); Assert.assertNotNull(target.getA2()); Assert.assertNotNull(target.getB1()); Assert.assertNotNull(target.getB2()); Assert.assertNotNull(target.getC1()); Assert.assertNotNull(target.getC2()); Assert.assertNotNull(target.getD1()); Assert.assertNotNull(target.getD2()); } }