blob: cba5419fa14b8db4f9c1203bdd2fedbd034760e5 [file] [log] [blame]
// 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.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();
ConfigurableWebApplicationContext ac = newMock(ConfigurableWebApplicationContext.class);
Runnable fred = mockRunnable();
Runnable barney = mockRunnable();
ServiceBuilderResources resources = mockServiceBuilderResources();
train_getInitParameter(servletContext, SpringConstants.USE_EXTERNAL_SPRING_CONTEXT, "true");
train_getAttribute(servletContext, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ac);
// Simulate barney as a factory bean.
expect(ac.getBeanNamesForType(Object.class)).andReturn(new String[] {"fred", "&barney"});
expect(ac.getParentBeanFactory()).andReturn(null);
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);
}
@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();
}
}