/*
* Copyright 2008, Unitils.org
*
* 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.unitils.spring;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.List;
import java.util.Properties;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.unitils.core.ConfigurationLoader;
import org.unitils.core.UnitilsException;
import org.unitils.spring.annotation.SpringApplicationContext;
/**
* Test for ApplicationContext creation in the {@link SpringModule}.
*
* @author Tim Ducheyne
* @author Filip Neven
*/
public class SpringModuleApplicationContextTest {
/* Tested object */
SpringModule springModule;
/**
* Initializes the test and test fixture.
*/
@Before
public void setUp() throws Exception {
Properties configuration = new ConfigurationLoader().loadConfiguration();
springModule = new SpringModule();
springModule.init(configuration);
}
/**
* Tests creating an application context using SpringApplicationContext on class level
*/
@Test
public void testGetApplicationContext() {
SpringTest springTest = new SpringTest();
ApplicationContext applicationContext = springModule.getApplicationContext(springTest);
assertNotNull(applicationContext);
}
/**
* Tests creating an application context using SpringApplicationContext on field level
*/
@Test
public void testGetApplicationContext_field() {
SpringTestField springTestField = new SpringTestField();
ApplicationContext applicationContext = springModule.getApplicationContext(springTestField);
assertNotNull(applicationContext);
}
/**
* Tests creating an application context using SpringApplicationContext on field level
*/
@Test
public void testGetApplicationContext_setter() {
SpringTestSetter springTestSetter = new SpringTestSetter();
ApplicationContext applicationContext = springModule.getApplicationContext(springTestSetter);
assertNotNull(applicationContext);
}
/**
* Tests creating an application context using a custom create method.
*/
@Test
public void testGetApplicationContext_customCreate() {
SpringTestCreateMethod springTestCreateMethod = new SpringTestCreateMethod();
ApplicationContext applicationContext = springModule.getApplicationContext(springTestCreateMethod);
assertNotNull(applicationContext);
}
/**
* Tests creating an application context using a custom create method with an application context argument.
*/
@Test
public void testGetApplicationContext_customCreateWithApplicationContext() {
SpringTestCreateMethodWithApplicationContext springTestCreateMethod = new SpringTestCreateMethodWithApplicationContext();
ApplicationContext applicationContext = springModule.getApplicationContext(springTestCreateMethod);
assertNotNull(applicationContext);
}
/**
* Tests for more than 1 annotation with values. An exception should have been raised.
*/
@Test
public void testGetApplicationContext_multipleAnnotationsWithValues() {
SpringTestMultipleAnnotationsWithValues springTestMultipleAnnotationsWithValues = new SpringTestMultipleAnnotationsWithValues();
try {
springModule.getApplicationContext(springTestMultipleAnnotationsWithValues);
fail("Expected UnitilsException");
} catch (UnitilsException e) {
// expected
}
}
/**
* Tests for more than 1 custom create methods. An exception should have been raised.
*/
@Test
public void testGetApplicationContext_twoCustomCreateMethods() {
SpringTestTwoCreateMethods springTestTwoCreateMethods = new SpringTestTwoCreateMethods();
try {
springModule.getApplicationContext(springTestTwoCreateMethods);
fail("Expected UnitilsException");
} catch (UnitilsException e) {
// expected
}
}
/**
* Tests getting an application context a second time, the same application context should be returned.
*/
@Test
public void testGetApplicationContext_twice() {
SpringTest springTestMixing = new SpringTest();
ApplicationContext applicationContext1 = springModule.getApplicationContext(springTestMixing);
ApplicationContext applicationContext2 = springModule.getApplicationContext(springTestMixing);
assertNotNull(applicationContext1);
assertSame(applicationContext1, applicationContext2);
}
/**
* Tests invalidating a cached application context.
*/
@Test
public void testInvalidateApplicationContext() {
SpringTest springTestMixing = new SpringTest();
ApplicationContext applicationContext1 = springModule.getApplicationContext(springTestMixing);
springModule.invalidateApplicationContext();
ApplicationContext applicationContext2 = springModule.getApplicationContext(springTestMixing);
assertNotNull(applicationContext1);
assertNotNull(applicationContext2);
assertNotSame(applicationContext1, applicationContext2);
}
/**
* Tests invalidating a cached application context using the class name.
*/
@Test
public void testInvalidateApplicationContext_classSpecified() {
SpringTest springTestMixing = new SpringTest();
ApplicationContext applicationContext1 = springModule.getApplicationContext(springTestMixing);
springModule.invalidateApplicationContext(SpringTest.class);
ApplicationContext applicationContext2 = springModule.getApplicationContext(springTestMixing);
assertNotNull(applicationContext1);
assertNotNull(applicationContext2);
assertNotSame(applicationContext1, applicationContext2);
}
/**
* Tests invalidating a cached application context using a wrong class name.
*/
@Test
public void testInvalidateApplicationContext_otherClassSpecified() {
SpringTest springTestMixing = new SpringTest();
ApplicationContext applicationContext1 = springModule.getApplicationContext(springTestMixing);
springModule.invalidateApplicationContext(String.class, List.class);
ApplicationContext applicationContext2 = springModule.getApplicationContext(springTestMixing);
assertNotNull(applicationContext1);
assertSame(applicationContext1, applicationContext2);
}
/**
* Tests creating an application context using a custom create method with a wrong signature.
*/
@Test
public void testGetApplicationContext_customCreateWrongSignature() {
SpringTestCreateMethodWrongSignature springTestCreateMethodWrongSignature = new SpringTestCreateMethodWrongSignature();
try {
springModule.getApplicationContext(springTestCreateMethodWrongSignature);
fail("Expected UnitilsException");
} catch (UnitilsException e) {
// expected
}
}
/**
* Tests creating an application context for an unknown location.
*/
@Test
public void testGetApplicationContext_wrongLocation() {
SpringTestWrongLocation springTestWrongLocation = new SpringTestWrongLocation();
try {
springModule.getApplicationContext(springTestWrongLocation);
fail("Expected UnitilsException");
} catch (UnitilsException e) {
// expected
}
}
/**
* Test SpringTest class with class level locations.
*/
@SpringApplicationContext({"classpath:org/unitils/spring/services-config.xml", "classpath:org/unitils/spring/services-config.xml"})
private class SpringTest {
}
/**
* Test SpringTest class with field level locations.
*/
private class SpringTestField {
@SpringApplicationContext({"classpath:org/unitils/spring/services-config.xml", "classpath:org/unitils/spring/services-config.xml"})
protected ApplicationContext field = null;
}
/**
* Test SpringTest class with setter level locations.
*/
private class SpringTestSetter {
@SpringApplicationContext({"classpath:org/unitils/spring/services-config.xml", "classpath:org/unitils/spring/services-config.xml"})
public void setField(ApplicationContext field) {
}
}
/**
* Test SpringTest class with a custom create method.
*/
private class SpringTestCreateMethod {
@SpringApplicationContext
protected ApplicationContext createMethod() {
return new ClassPathXmlApplicationContext("classpath:org/unitils/spring/services-config.xml");
}
}
/**
* Test SpringTest class with a custom create method with application context argument.
*/
private class SpringTestCreateMethodWithApplicationContext {
@SpringApplicationContext
protected ApplicationContext createMethod(List<String> locations) {
assertTrue(locations.isEmpty());
return new ClassPathXmlApplicationContext("classpath:org/unitils/spring/services-config.xml");
}
}
/**
* Test SpringTest class mixing multiple annotations.
*/
@SpringApplicationContext({"1"})
private class SpringTestMultipleAnnotationsWithValues {
@SpringApplicationContext({"2"})
protected ApplicationContext field1;
@SpringApplicationContext({"3"})
protected ApplicationContext field2;
}
/**
* Test SpringTest class with 2 custom create methods.
*/
private class SpringTestTwoCreateMethods {
@SpringApplicationContext
protected ApplicationContext createMethod1(List<String> locations) {
return null;
}
@SpringApplicationContext
protected ApplicationContext createMethod2(List<String> locations) {
return null;
}
}
/**
* Test SpringTest class with a custom create method having a wrong signature.
*/
private class SpringTestCreateMethodWrongSignature {
@SpringApplicationContext
protected List<?> createMethod(String a) {
return null;
}
}
/**
* Class level configuration a wrong location specified.
*/
@SpringApplicationContext("xxxxxxx")
public class SpringTestWrongLocation {
}
}