// Copyright 2008, 2009 The Apache Software Foundation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package org.apache.tapestry5.internal.spring; import org.apache.tapestry5.ioc.ObjectCreator; import org.apache.tapestry5.ioc.ScopeConstants; import org.apache.tapestry5.ioc.ServiceBuilderResources; import org.apache.tapestry5.ioc.def.ServiceDef; import org.apache.tapestry5.spring.SpringConstants; import org.apache.tapestry5.spring.SpringTestCase; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.WebApplicationContext; import org.testng.annotations.Test; import javax.servlet.ServletContext; public class SpringModuleDefTest extends SpringTestCase { @Test public void load_application_context_externally() { ServletContext servletContext = mockServletContext(); ConfigurableListableBeanFactory beanFactory = newMock( ConfigurableListableBeanFactory.class); ConfigurableWebApplicationContext ac = newMock(ConfigurableWebApplicationContext.class); Runnable fred = mockRunnable(); Runnable barney = mockRunnable(); Runnable arnold = mockRunnable(); BeanDefinition fredBeanDef = newMock(BeanDefinition.class); BeanDefinition barneyBeanDef = newMock(BeanDefinition.class); BeanDefinition arnoldBeanDef = newMock(BeanDefinition.class); ServiceBuilderResources resources = mockServiceBuilderResources(); train_getInitParameter(servletContext, SpringConstants.USE_EXTERNAL_SPRING_CONTEXT, "true"); train_getAttribute(servletContext, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ac); expect(ac.getBeanFactory()).andReturn(beanFactory); expect(ac.getBeanDefinitionNames()).andReturn(new String[] { "fred", "&barney", "arnold" }); expect(fredBeanDef.isAbstract()).andReturn(false); expect(barneyBeanDef.isAbstract()).andReturn(false); expect(arnoldBeanDef.isAbstract()).andReturn(true); expect(beanFactory.getBeanDefinition("fred")).andReturn(fredBeanDef); expect(beanFactory.getBeanDefinition("&barney")).andReturn(barneyBeanDef); expect(beanFactory.getBeanDefinition("arnold")).andReturn(arnoldBeanDef); replay(); SpringModuleDef moduleDef = new SpringModuleDef(servletContext); ServiceDef serviceDef = moduleDef.getServiceDef(SpringModuleDef.SERVICE_ID); ObjectCreator serviceCreator = serviceDef.createServiceCreator(resources); assertSame(serviceCreator.createObject(), ac); verify(); // Now, let's test for some of the services. ServiceDef sd = moduleDef.getServiceDef("ApplicationContext"); assertEquals(sd.getServiceInterface(), ac.getClass()); assertEquals(sd.createServiceCreator(null).toString(), "<ObjectCreator for externally configured Spring ApplicationContext>"); expect((Class)ac.getType("fred")).andReturn(Runnable.class); expect(ac.getBean("fred")).andReturn(fred); sd = moduleDef.getServiceDef("fred"); replay(); assertEquals(sd.getServiceId(), "fred"); assertEquals(sd.getServiceInterface(), Runnable.class); assertEquals(sd.getServiceScope(), ScopeConstants.DEFAULT); assertSame(sd.createServiceCreator(null).createObject(), fred); assertTrue(sd.getMarkers().isEmpty()); assertFalse(sd.isEagerLoad()); assertEquals(sd.createServiceCreator(null).toString(), "ObjectCreator<Spring Bean 'fred'>"); verify(); expect((Class)ac.getType("barney")).andReturn(Runnable.class); expect(ac.getBean("barney")).andReturn(barney); replay(); sd = moduleDef.getServiceDef("barney"); assertSame(sd.createServiceCreator(null).createObject(), barney); assertNull(moduleDef.getServiceDef("arnold")); } @Test public void missing_external_application_context() { ServletContext servletContext = mockServletContext(); train_getInitParameter(servletContext, SpringConstants.USE_EXTERNAL_SPRING_CONTEXT, "true"); train_getAttribute(servletContext, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, null); replay(); try { new SpringModuleDef(servletContext); unreachable(); } catch (NullPointerException ex) { assertMessageContains(ex, "No Spring ApplicationContext stored in the ServletContext", WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); } verify(); } }